溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#中 ReaderWriterLock的作用是什么

發(fā)布時(shí)間:2021-07-07 16:43:11 來(lái)源:億速云 閱讀:112 作者:Leah 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)C#中 ReaderWriterLock的作用是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

Performance非常差

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

很多個(gè)thread同時(shí)acquire到了ReaderLock,

他們都call UpgradeToWriterLock,如果這個(gè)operation是atomic的,那么沒(méi)有哪個(gè)thread能upgrade成功。

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

code:

  1. class LockFreeDictionary<Key, Value>{  

  2. private Dictionary<Key, Value> m_dict = new Dictionary<Key, Value>();  

  3.  

  4. public Value Lookup(Key key){  

  5. return m_dict[key];  

  6. }  

  7.  

  8. public void Update(Key key, Value value){  

  9. Dictionary<Key, Value> newDict = null;  

  10. Dictionary<Key, Value> oldDict = null;  

  11. do{  

  12. oldDict = m_dict;  

  13. newnewDict = new Dictionary<Key, Value>(oldDict);  

  14. newDict[key] = value;  

  15. }  

  16. while (Interlocked.CompareExchange<Dictionary<Key, Value>>
    (ref m_dict, newDict, oldDict) != oldDict);  

  17. }  

  18. }  

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

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

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

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

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

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

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

關(guān)于C#中 ReaderWriterLock的作用是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI