偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

C#常用線(xiàn)程同步方法應(yīng)用場(chǎng)景和實(shí)現(xiàn)原理

開(kāi)發(fā) 后端
我們將要談到的是C#常用線(xiàn)程同步方法應(yīng)用場(chǎng)景和實(shí)現(xiàn)原理,將列舉一些關(guān)鍵字供大家參考。

volatile

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

Interlocked

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

lock

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

Mutex

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

Semaphore(Binary semaphore)

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

Spin lock

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

AutoResetEvent,ManualResetEvent  (Event)

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

ReaderWriterLockSlim

這個(gè)也是lock的封裝,對(duì)資源的訪問(wèn)方式有共享和獨(dú)占方式,例如我們控制對(duì)某個(gè)資源讀貢獻(xiàn)或者寫(xiě)?yīng)氄?,那么這個(gè)類(lèi)可以派上用場(chǎng)。

SynchronizationAttribute ,MethodImplAttribute

這兩個(gè)屬于類(lèi)特性和方法的特性,標(biāo)識(shí)某個(gè)類(lèi)或方法是同步方法,本質(zhì)上基于lock的實(shí)現(xiàn)。

WaitHandle

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

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

【編輯推薦】

  1. C#取整函數(shù)實(shí)例應(yīng)用詳解
  2. C#單元測(cè)試的一個(gè)小故事
  3. C#單元測(cè)試概念及作用的淺析
  4. C#單元測(cè)試使用的必要性的淺析
  5. C#單元測(cè)試的運(yùn)行淺析
責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2009-08-18 09:22:47

應(yīng)用場(chǎng)景C#分部方法

2024-11-27 08:15:50

2011-04-27 09:22:28

C#延遲加載

2021-06-06 23:40:53

線(xiàn)程池使用場(chǎng)景

2018-04-02 14:50:22

Java多線(xiàn)程應(yīng)用場(chǎng)景

2021-03-08 08:48:02

應(yīng)用場(chǎng)景項(xiàng)目

2024-09-30 10:06:27

2009-08-04 17:57:41

C#線(xiàn)程同步死鎖

2021-04-21 09:21:07

zookeeper集群源碼

2009-09-04 14:41:09

C#同步線(xiàn)程

2009-08-04 16:58:21

C#線(xiàn)程BeginInvokeEndInvoke

2009-08-21 10:28:21

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

2011-06-17 16:18:18

C#

2009-09-17 16:45:56

C#數(shù)組

2009-08-04 18:00:51

C#線(xiàn)程同步Monitor

2024-04-16 12:13:07

usingC#開(kāi)發(fā)

2022-04-10 23:38:33

Redis數(shù)據(jù)結(jié)構(gòu)開(kāi)發(fā)

2024-09-06 11:52:47

2012-10-31 17:37:48

2009-08-17 17:56:32

C# 枚舉
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)