一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

【經(jīng)驗總結(jié)】C#常用線程同步方法應(yīng)用場景和實現(xiàn)原理

  簡單描述volatile,Interlocked,lock,Mutex,Semaphore,Spin lock,AutoResetEvent,ManualResetEvent,ReaderWriterLockSlim,MethodImplAttribute,WaitHandle常用同步機制的原理和使用場景。

  volatile

  只是C#的一個關(guān)鍵字,告訴編譯器不能將聲明的這個變量進行CPU內(nèi)部緩存,只能在主內(nèi)存中操作,類型有限制,volatile并不能實現(xiàn)真正的同步,因為它的操作級別只停留在變量級別,而不是原子級別。如果是在單處理器系統(tǒng)中,是沒有任何問題的,變量在主存中沒有機會被其他人修改,因為只有一個處理器,這就叫作processor Self-Consistency。但在多處理器系統(tǒng)中,可能就會有問題。 每個處理器都有自己的data cache,而且被更新的數(shù)據(jù)也不一定會立即寫回到主存。所以可能會造成不同步,但這種情況很難發(fā)生,因為cache的讀寫速度相當快,flush的頻率也相當高,只有在壓力測試的時候才有可能發(fā)生,而且?guī)茁史浅7浅P 1举|(zhì)上說并非絕對的同步方法。

  Interlocked

  對于例如int變量等的原子操作,效率高,可靠性高,一般通過CPU的專用指令實現(xiàn)的鎖住內(nèi)存總線實現(xiàn)的。

  lock

  lock與Monitor本身是一致的,lock是做到了C#的關(guān)鍵字一級,是.NET對象自身支持的的一種同步機制,對象中有相關(guān)的結(jié)構(gòu)支持這種輕量級的線程同步,實現(xiàn)機制類似于CRITICAL_SECTION,但是CRITICAL_SECTION具有跨進程特性,而lock只能實現(xiàn)同一進程中的線程同步,在C#開發(fā)中很常用。

  Mutex

  是WIN32下的突變體內(nèi)核對象的封裝,類似于一間屋子只能進入一個人。是它的一個.NET封裝,效率比較低,由于突變體是一種windows內(nèi)核對象,需要開銷很大,但是支持跨進程,通過給Mutex命名的方式支持進程間同步,甚至可以跨服務(wù)器訪問,是一種服務(wù)器之間同步的選擇。Mutex的擁有者才能釋放這個Mutex,其他進程不能釋放,可能是考慮到安全問題。Mutex是一種基于線程調(diào)度的同步方式,控制的是線程的調(diào)度,實現(xiàn)了sleep,如果有信號可以通知內(nèi)核線程調(diào)度程序調(diào)度等待線程。

  Semaphore(Binary semaphore)

  基于WIN32的Semaphore,也是一種基于線程調(diào)度,基本很類似于Mutex,與Mutex不同之處在于Semaphore允許多人進入同一間屋子,使用count計數(shù)來實現(xiàn),當允許數(shù)量為1時叫做Binary semaphore,這時候就是基本和Mutex很類似的,但是沒有Mutex擁有者一說,可由任何進程進行資源釋放。

  Spin lock

  這是一個內(nèi)核態(tài)概念。spin lock與semaphore的主要區(qū)別是spin lock是busy waiting,而semaphore是sleep。對于可以sleep的進程來說,busy waiting當然沒有意義,CPU只是在那里空轉(zhuǎn)而已,而且IRQL比較高,適合于等待時間比較短的場景。對于單CPU的系統(tǒng),busy waiting當然更沒意義(沒有CPU可以釋放鎖),所有Spin lock只對多CPU才有意義,因此,只有多CPU的內(nèi)核態(tài)非進程空間,才會用到spin lock。其實也就是類似mutex的作用,串行化對 critical section的訪問。但是mutex不能保護中斷的打斷,也不能在中斷處理程序中被調(diào)用。而spin lock也一般沒有必要用于可以sleep的進程空間。幸好它是內(nèi)核級的,如果是用戶級的會很危險。      AutoResetEvent,ManualResetEvent (Event)

  這兩種的實現(xiàn)都是基于WIN32的Event原理,同步事件有兩種:AutoResetEvent 和 ManualResetEvent。它們之間唯一的不同在于,無論何時,只要 AutoResetEvent 激活線程,它的狀態(tài)將自動從終止變?yōu)榉墙K止。相反,ManualResetEvent 允許它的終止狀態(tài)激活任意多個線程,只有當它的 Reset 方法被調(diào)用時才還原到非終止狀態(tài)。

  ReaderWriterLockSlim

  這個也是lock的封裝,對資源的訪問方式有共享和獨占方式,例如我們控制對某個資源讀貢獻或者寫?yīng)氄迹敲催@個類可以派上用場。

  SynchronizationAttribute ,MethodImplAttribute

  這兩個屬于類特性和方法的特性,標識某個類或方法是同步方法,本質(zhì)上基于lock的實現(xiàn)。

  WaitHandle

  可以通過調(diào)用一種等待方法,如 WaitOne、WaitAny 或 WaitAll,讓線程等待事件。  System.Threading.WaitHandle.WaitOne 使線程一直等待,直到單個事件變?yōu)榻K止狀態(tài);System.Threading.WaitHandle.WaitAny 阻止線程,直到一個或多個指示的事件變?yōu)榻K止狀態(tài);System.Threading.WaitHandle.WaitAll 阻止線程,直到所有指示的事件都變?yōu)榻K止狀態(tài)。當調(diào)用事件的 Set 方法時,事件將變?yōu)榻K止狀態(tài)。WaitOne基于WaitSingleObject,WaitAny 或 WaitAll基于WaitmultipleObject,具體由后面參數(shù)來決定。WaitmultipleObject實現(xiàn)要比WaitSingleObject復(fù)雜的多,性能也不好,盡量少用。

NET技術(shù)【經(jīng)驗總結(jié)】C#常用線程同步方法應(yīng)用場景和實現(xiàn)原理,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 欧美三级网站 | 国产精品短篇二区 | 日韩在线观看中文字幕 | 目韩一区二区三区系列片丶 | 国产色综合一区二区三区 | 奇米色吧 | 狠狠欧美 | 韩日一级毛片 | www.激情.com| 国产极品精频在线观看 | 97影院理论午夜论不卡 | 亚洲一区播放 | 亚洲综合在线成人一区 | 色一情一区二区三区四区 | 国产在线观看中文字幕 | 午夜国产福利在线观看 | 欧美精品日韩一区二区三区 | 韩国一级毛片免费完整视频 | 国产成人鲁鲁免费视频a | 精品久久久久亚洲 | 日本免费一区二区三区视频 | 国产在线观看中文字幕 | 一区二区三区影院 | 黄片毛片在线观看 | 精品麻豆视频 | 国产精品久久久亚洲456 | 97精品在线视频 | 一区二区三区视频观看 | 6080午夜乱理伦片 | 亚洲国产一区在线 | 四虎精品久久久久影院 | 女人夜色黄网在线观看 | 国产好吊妞视频在线观看 | 美女视频黄.免费网址 | 国产日韩精品视频一区二区三区 | 国产中日韩一区二区三区 | 久久国产加勒比精品无码 | 最近更新中文字幕第一页 | 国产zzzwww在线观看视频 | 婷婷激情丁香 | 欧美日本高清视频在线观看 |