日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺談C#ReaderWriterLock

前一陣在一個project中使用了C# ReaderWriterLock,發(fā)現(xiàn)了兩個問題:

Performance非常差

UpgradeToWriterLock并不是atomic的從ReaderLock轉(zhuǎn)換到WriterLock,而是等同于"lock.ReleaseReaderLock(); lock.AcquireWriterLock();".這樣的semantics有一定的迷惑性,我開始的時候也認(rèn)為這個operation是 atomic的,等出現(xiàn)bug并debug了很久才發(fā)現(xiàn)原來如此。不過經(jīng)過認(rèn)真的思考,發(fā)現(xiàn)這其實(shí)不是。NET designer的錯,根本沒辦法把這個operation設(shè)計(jì)成atomic的。原因如下:

很多個thread同時acquire到了ReaderLock,

他們都call UpgradeToWriterLock,如果這個operation是atomic的,那么沒有哪個thread能upgrade成功。

后來我干脆不用C# ReaderWriterLock了,直接換成了LockFree的方法。在C#中實(shí)現(xiàn)LockFree其實(shí)是很簡單的,因?yàn)橛辛薌arbage Collection,

code:

 
 
 
  1. class LockFreeDictionary, Value>{
  2. private Dictionary, Value> m_dict = new Dictionary, Value>();
  3. public Value Lookup(Key key){
  4. return m_dict[key];
  5. }
  6. public void Update(Key key, Value value){
  7. Dictionary, Value> newDict = null;
  8. Dictionary, Value> oldDict = null;
  9. do{
  10. oldDict = m_dict;
  11. newnewDict = new Dictionary, Value>(oldDict);
  12. newDict[key] = value;
  13. }
  14. while (Interlocked.CompareExchange, Value>>
    (ref m_dict, newDict, oldDict) != oldDict);
  15. }
  16. }

第16行 ,保持參照原有Dictionary物件,

第17行,建造一個新的字典對象的基礎(chǔ)上原有的物件。為oldDict ,這一步是只讀的,而且不需要鎖,

第18行,執(zhí)行更新操作后,新建造的對象,

第19行,請嘗試更換新的對象到原來的1 。如果返回值Interlocked.CompareExchange操作不等于oldDict ,這意味著在此做,而塊executation ,有另一個線程改變m_dict 。在這種情況下,我們需要做更新一次。

換出的對象( oldDict )可以收集到的垃圾收集。

如果我們想用LockFree數(shù)據(jù)結(jié)構(gòu)C++中,還有另一種技術(shù)稱為危害指針。這是在IBM的研究論文。

不過不是什么情況都可以使用這種LockFreeDictionary的,,不然你會得到相反的效果(performance很差),這里的scenario是read非常多,write非常少。 不過這種情況也挺常見的。

這種方法的好處是在Lookup的時候沒有任何lock,從而極大的提高了performance.(我的project里面比C# ReaderWriterLock提高了2000倍,)

對LockFree有研究的或者有興趣的可以留言大家討論討論


網(wǎng)站欄目:淺談C#ReaderWriterLock
文章起源:http://m.5511xx.com/article/dhghdie.html