成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#常用線程同步方法應用場景和實現原理

開發 后端
我們將要談到的是C#常用線程同步方法應用場景和實現原理,將列舉一些關鍵字供大家參考。

volatile

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

Interlocked

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

lock

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

Mutex

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

Semaphore(Binary semaphore)

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

Spin lock

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

AutoResetEvent,ManualResetEvent  (Event)

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

ReaderWriterLockSlim

這個也是lock的封裝,對資源的訪問方式有共享和獨占方式,例如我們控制對某個資源讀貢獻或者寫獨占,那么這個類可以派上用場。

SynchronizationAttribute ,MethodImplAttribute

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

WaitHandle

可以通過調用一種等待方法,如 WaitOne、WaitAny 或 WaitAll,讓線程等待事件。System.Threading.WaitHandle.WaitOne 使線程一直等待,直到單個事件變為終止狀態;System.Threading.WaitHandle.WaitAny 阻止線程,直到一個或多個指示的事件變為終止狀態;System.Threading.WaitHandle.WaitAll 阻止線程,直到所有指示的事件都變為終止狀態。當調用事件的 Set 方法時,事件將變為終止狀態。WaitOne基于WaitSingleObject,WaitAny 或 WaitAll基于WaitmultipleObject,具體由后面參數來決定。WaitmultipleObject實現要比WaitSingleObject復雜的多,性能也不好,盡量少用。

原文鏈接:http://www.cnblogs.com/Thriving-Country/archive/2010/12/21/1912444.html

【編輯推薦】

  1. C#取整函數實例應用詳解
  2. C#單元測試的一個小故事
  3. C#單元測試概念及作用的淺析
  4. C#單元測試使用的必要性的淺析
  5. C#單元測試的運行淺析
責任編輯:彭凡 來源: 博客園
相關推薦

2009-08-18 09:22:47

應用場景C#分部方法

2024-11-27 08:15:50

2011-04-27 09:22:28

C#延遲加載

2021-06-06 23:40:53

線程池使用場景

2018-04-02 14:50:22

Java多線程應用場景

2021-03-08 08:48:02

應用場景項目

2024-09-30 10:06:27

2021-04-21 09:21:07

zookeeper集群源碼

2009-09-04 14:41:09

C#同步線程

2009-08-04 17:57:41

C#線程同步死鎖

2009-08-04 16:58:21

C#線程BeginInvokeEndInvoke

2009-08-21 10:28:21

C#異步方法C#同步方法

2009-09-17 16:45:56

C#數組

2011-06-17 16:18:18

C#

2024-04-16 12:13:07

usingC#開發

2009-08-04 18:00:51

C#線程同步Monitor

2022-04-10 23:38:33

Redis數據結構開發

2024-09-06 11:52:47

2011-05-17 15:24:18

Shibboleth認證

2024-04-11 13:41:47

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区视频 | 亚洲一区二区在线播放 | 国产精品视频在线播放 | www在线| 看羞羞视频免费 | 国产探花在线精品一区二区 | 亚洲淫视频 | 一级久久久久久 | 在线日韩欧美 | 欧美小视频在线观看 | 久久综合av | 久久99国产精一区二区三区 | 国产欧美日韩一区二区三区在线观看 | 日韩不卡一二区 | 91视频在线看 | av资源网站 | 亚洲精品一区二区三区中文字幕 | 精品乱码一区二区三四区 | 日日日干干干 | 国产精品免费av | 免费成年网站 | 亚欧性视频 | 亚洲综合伊人 | 久久久久黄色 | 黄色网址在线免费观看 | 国产精品高潮呻吟久久av黑人 | 国产精品毛片一区二区在线看 | 中文字幕综合在线 | 免费看的黄网站 | 天天干狠狠操 | 天天射网站 | 久久最新精品视频 | 久久中文字幕一区 | 欧美一区2区三区4区公司 | 国产剧情一区 | 久久久综合| 国产1页 | 欧美成人免费在线视频 | 久日精品| 一区免费 | 精品国产一区二区三区久久狼黑人 |