亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Lock,LockFree,MemoryBarrier,ConcurrentCollection

2019-11-17 03:18:43
字體:
來源:轉載
供稿:網友

Lock,LockFree,MemoryBarrier,ConcurrentCollection

最近看并行編程書本的一些心得,簡單記錄下多線程和并行編程必知必會的幾個概念,再次加深自己的理解。

.NET Framework4提供了一個新的命名空間System.Collections.Concurrent用于解決常用集合在并發情況下的線程安全問題(ps:通過這個命名空間還可以訪問用于并行化循環和PLINQ的自定義分區器Partitioner)。這個命名空間下的所有線程安全集合都在某種程度上使用了無鎖技術。也就是說,這些集合通過使用比較并交換(Compare And Swap,CAS)指令和內存屏障(Memory Barrier),避免了使用典型的互斥的重量級的鎖,雖然實際開發中對性能要求不高的業務系統中加鎖可以獲得最經濟實惠的開發效益。

一、鎖

在多線程和并發這兩個主題下從來都離不開鎖的身影,鎖是用來做并發最簡單但是代價也可能是最高的方式,在某些場景下加鎖是非常經濟實惠的解決方案。

鎖很好用,代碼也極好維護,但是必須清楚不能濫用,否則可能導致嚴重性能問題。因為加鎖會增加系統內核態與用戶態之間的切換開銷以及線程調度開銷。我們知道,加鎖、釋放鎖會導致上下文切換和調度延時,等待鎖的線程會被掛起直至鎖釋放。內核態的鎖需要操作系統進行一次上下文切換,在上下文切換的時候,cpu之前緩存的指令和數據都將失效,對性能影響最大。

1、使用鎖的三大基本原則

a、不使用鎖

b、使用小粒度的鎖,常見的鎖如互斥鎖(lock)、讀寫鎖(ReaderWriterLockSlim,ReaderWriterLock)等等

c、鎖住盡可能短的時間

2、同步對象

為了封裝鎖的邏輯,通常需要一個同步對象。比如常見的簡單粗暴的同步代碼里,lock(sth)的sth就是一個同步對象。

同步對象必須是引用類型(字符串通常不適合做同步對象,想想為什么),而且它通常是私有的,通常是一個instance或者static field。

為了精確的控制鎖的scope和粒度,我們通常會創建一個dedicated字段,比如locker,asyncObj等;

避免使用lock(this) 或者lock(typeof(sometype))或者lock(string),這種使用方法將無法封裝鎖的邏輯,難以避免死鎖和過度的阻塞,甚至在一個進程內還會溢出app domain邊界。

3、如何減少鎖?

如果你的設計為了復用而有很多共享數據,那么在多線程高并發環境下使用Lock還是LockFree的同步算法都是不可避免的。

根據經驗,當我們需要訪問共享的可寫字段時,通常就可以通過鎖來同步。

為了減少鎖,我們需要減少共享數據的使用。

二、CAS

1、基本原理

CAS,簡單說來就是比較并交換,大致邏輯就是如果A與B相等,那么將C賦值給A。

CAS 操作包含三個操作數:內存位置(V)、預期原值(A)和新值(B)。

如果內存位置的值V與預期原值A相匹配,那么處理器會自動將該位置值更新為新值B;否則,處理器不做任何操作。

2、內部實現偽代碼

bool CAS(T* ptr, T expected, T fresh){    if(*ptr != expected)         return false;    *ptr = fresh;    return true;}

3、優點

CAS是CPU指令級的操作,看上去只有一步原子操作,避免了請求操作系統來裁定鎖的問題,所以一般很快。CAS操作是基于共享數據不會被修改的假設,當同步沖突出現的機會很少時,這種假設就能帶來較大的性能提升。主要優點如下:

a、避免通常加鎖所導致的嚴重性能開銷,減少了內核態與用戶態之間的切換開銷以及線程調度開銷;

b、實現更細力度的并行控制,提高系統吞吐量,有些情況下可以達到成倍的關鍵業務的性能提升。

4、缺點

CAS雖然有明顯的優點,但天下沒有免費的午餐 ,通過CAS實現的LockFree也存在很多問題,比如:a、與硬件體系結構的內存讀寫模型相關,所以存在移植問題b、實現復雜,其正確性很難被證明 (a)、受限于CPU指令 (b)、即使簡單的數據結構也要通過復雜的算法來實現 (c)、ABA問題c、代碼難以維護d、存在活鎖(livelock)問題

所謂活鎖,簡單來講就是指事物1可以使用資源,但它讓其他事物先使用資源;事物2可以使用資源,但它也讓其他事物先使用資源,于是兩者一直謙讓,結果兩者都無法使用資源。

三、MemoryBarrier

為什么需要MemoryBarrier(內存屏蔽),MSDN的解釋是:

MemoryBarrier is required only on multiprocessor systems with weak memory ordering (for example, a system employing multiple Intel Itanium PRocessors).

Synchronizes memory access as follows: The processor executing the current thread cannot reorder instructions in such a way that memory accesses prior to the call to MemoryBarrier execute after memory accesses that follow the call to MemoryBarrier.

簡單來說就是多核處理器會對運行CPU指令順序重排優化,而編譯后的程序可能因為編譯器優化或者計算機硬件結構比如分布式系統等諸多原因,不以編碼時的順序執行,從而引發預期外的問題。

Memory Barrier就是一種在底層保證語句按順序執行的解決方案,調用Thread.MemoryBarrier()之后的代碼中內存訪問不能在這之前就完成了,也就是它可以限制指令重排和內存讀寫的緩存。

參考:

http://stackoverflow.com/questions/3556351/why-we-need-thread-memorybarrier

Barrier類,允許多個任務同步它們不同階段上的并發工作。

四、并行集合

System.Collections.Concurrent命名空間下主要的線程安全并行集合有如下幾種:

1、ConcurrenctQueue<T>

ConcurrenctQueue是System.Collections.Queue的并發版本。它是一個FIFO(Fisrt In,First Out,先進先出)的集合。

ConcurrenctQueue是完全無鎖的,但是當CAS操作失敗且面臨資源爭用的時候,它可能會自旋并且進行重試操作。

2、ConcurrenctStack<T>

ConcurrenctStack是System.Collections.Stack的并發版本。它是一個LIFO(Lastt In,First Out,后進先出)的集合。

ConcurrenctStack是完全無鎖的,但是當CAS操作失敗且面臨資源爭用的時候,它可能會自旋并且進行重試操作。

3、ConcurrenctBag<T>

ConcurrenctBag提供了一個無序的對象集合,而且支持對象重復,當不用考慮順序時非常有用。

ConcurrenctBag使用了很多不同的機制,最大程度地減少了同步的需求以及同步所帶來的開銷。

ConcurrenctBag為每一個訪問集合的線程維護了一個本地隊列,而且在可能的情況下,它會以無鎖的方式訪問這個本地隊列。

ConcurrenctBag在同一個線程添加元素(生產)和刪除元素(消費)的場合下效率非常高。然而,ConcurrenctBag有時候會用到鎖,因此,在生產者和消費者線程完全分開的場景下效率非常低下。

4、ConcurrenctDictionary<TKey,TValue>

ConcurrenctDictionary與經典的鍵值對的字典類似,提供了并發的鍵值訪問。它是System.Collections.IDictionary實現的并發版本。

ConcurrenctDictionary對于讀操作是完全無鎖的,它對于需要頻繁使用讀取的操作進行了優化。

當很多任務或者線程在字典中添加或者修改數據的時候,ConcurrenctDictionary會使用細粒度的鎖。

5、 BlockingCollection<T>

BlockingCollection與經典的阻塞隊列數據結構類似,它是對一個IProducerConsumerCollection<T>實例的包裝器,提供了阻塞(block)和限界(bound)的能力。

BlockingCollection能夠適用于有多個任務添加和刪除數據的生產者-消費者的情形。

這里再順帶提一下IProducerConsumerCollection<T>這個接口,它繼承自IEnumerable<T>、ICollection和IEnumerable。忍不住要為IProducerConsumerCollection<T>、IEnumerable<T>、ICollection和IEnumerable這幾個接口的抽象拍手叫好??梢哉f,MS對集合的設計是非常富有遠見并適應變化的。

PS:關于并行集合和線程安全,很久之前我也寫過總結,可以參考之前的拙文淺析線程安全容器的實現。

參考:

<<C#并行編程高級教程>>

http://msdn.microsoft.com/zh-cn/library/system.collections.concurrent(v=vs.110).aspx

http://msdn.microsoft.com/zh-cn/library/dd267312(v=vs.110).aspx

http://blog.hesey.net/2011/09/resolve-aba-by-atomicstampedreference.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲图片欧美日产| 91久久精品国产91久久| 亚洲热线99精品视频| 国产成人精品视频| www.久久久久| 91探花福利精品国产自产在线| 国产精品久久久一区| 亚洲第一视频网| 91亚洲国产成人久久精品网站| 久久天天躁狠狠躁夜夜av| 久久99精品久久久久久青青91| 欧美黄色片免费观看| 精品中文字幕乱| 欧美一区二粉嫩精品国产一线天| 国产亚洲精品一区二555| 高清欧美性猛交xxxx| 久久综合九色九九| 久久久久久香蕉网| 午夜精品www| 亚洲精品国产精品国自产在线| 久热爱精品视频线路一| 久久久亚洲天堂| 精品高清一区二区三区| 日韩免费看的电影电视剧大全| 4444欧美成人kkkk| 热久久美女精品天天吊色| 国产精品第8页| 国产成人鲁鲁免费视频a| 欧美怡春院一区二区三区| 国产视频自拍一区| 欧美美女18p| 亚洲精品久久久久久久久| 日韩欧美在线字幕| 一区二区三区在线播放欧美| 国产剧情久久久久久| 亚洲精品中文字幕av| 国产91精品高潮白浆喷水| 国产中文欧美精品| 日本中文字幕成人| 亚洲国产第一页| 俺去了亚洲欧美日韩| 欧洲亚洲妇女av| 亚洲图片制服诱惑| 91久久国产综合久久91精品网站| 亚洲欧美在线一区二区| 91精品免费视频| 尤物yw午夜国产精品视频| 亚洲精品第一页| 在线播放国产一区中文字幕剧情欧美| 亚洲四色影视在线观看| 久久777国产线看观看精品| 国产精品91一区| 欧美成人午夜视频| 成人日韩av在线| 日韩视频亚洲视频| 欧美一级在线播放| 国产免费观看久久黄| 精品一区二区亚洲| 日韩精品在线免费播放| 欧美在线一区二区三区四| 国产精品免费电影| 亚洲精品不卡在线| 久久夜色精品国产欧美乱| 欧美黑人xxxx| 亚洲精品久久久一区二区三区| 欧美性高潮床叫视频| 欧美日韩国产成人在线| 精品国产乱码久久久久久虫虫漫画| 成人欧美一区二区三区黑人| 精品久久久久久电影| 国产成人综合亚洲| 国产精品视频午夜| 欧美激情综合色综合啪啪五月| 亚洲va码欧洲m码| 91亚洲va在线va天堂va国| 色婷婷久久av| 精品久久久久国产| 欧美日韩在线免费| 欧美激情三级免费| 成人动漫网站在线观看| 日韩中文在线中文网三级| 亚洲欧美激情精品一区二区| 97香蕉超级碰碰久久免费软件| 亚洲天堂开心观看| 日韩免费av一区二区| 久久综合电影一区| 最新日韩中文字幕| 91成人在线观看国产| 国产一区二区黄| 中文在线不卡视频| 欧美日本国产在线| 亚洲福利视频免费观看| 久久久久久久国产精品视频| 国产精品视频永久免费播放| 亚洲欧美资源在线| 欧美不卡视频一区发布| 疯狂做受xxxx欧美肥白少妇| 欧美日韩日本国产| 91最新国产视频| 中文字幕亚洲综合| 最新国产精品拍自在线播放| 国产亚洲欧美视频| 久久成人18免费网站| 岛国视频午夜一区免费在线观看| 97国产精品人人爽人人做| 午夜剧场成人观在线视频免费观看| 日韩av在线免费观看| 欧美一区二区色| 亚洲无限av看| 国产成人自拍视频在线观看| 国产精品男人爽免费视频1| 欧美精品18videos性欧美| 中文字幕亚洲天堂| 欧美日韩免费看| 色综合亚洲精品激情狠狠| 亚洲精品一区久久久久久| 久久久视频精品| 中文字幕视频在线免费欧美日韩综合在线看| 91精品国产沙发| 午夜精品久久久久久久白皮肤| 欧美黑人视频一区| 色先锋资源久久综合5566| 亚洲自拍偷拍在线| 日韩中文字幕视频| 91国在线精品国内播放| 亚洲女人天堂色在线7777| 久久视频在线视频| 伊人久久综合97精品| 国产极品jizzhd欧美| 国产精品扒开腿做爽爽爽的视频| 亚洲美女在线视频| 亚洲国产精品久久精品怡红院| 亚洲国产另类久久精品| 久久免费视频网| 成人国产精品免费视频| 国产成人精品a视频一区www| 亚洲精品视频中文字幕| 国产免费一区二区三区在线能观看| 久久躁日日躁aaaaxxxx| 奇米4444一区二区三区| 欧美黑人狂野猛交老妇| 中文字幕日本精品| 亚洲国产欧美精品| 欧美在线观看网站| 日韩精品极品在线观看| 国产精品国产三级国产专播精品人| 国产欧美日韩精品丝袜高跟鞋| 欧美老肥婆性猛交视频| 欧美高跟鞋交xxxxxhd| 国产免费一区二区三区香蕉精| 欧美精品一二区| 欧美精品在线视频观看| 91精品国产综合久久久久久蜜臀| 久久99精品久久久久久噜噜| 欧美日韩国产区| 国产精品午夜国产小视频| 麻豆一区二区在线观看| 国产在线观看一区二区三区| 亚洲色图校园春色| 亚洲精品动漫100p| 成人观看高清在线观看免费| 2020欧美日韩在线视频| 欧美成人第一页| 欧美综合激情网|