自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談C# ReaderWriterLock

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

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

Performance非常差

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

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

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

后來我干脆不用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ì)象到原來的1 。如果返回值Interlocked.CompareExchange操作不等于oldDict ,這意味著在此做,而塊executation ,有另一個(gè)線程改變m_dict 。在這種情況下,我們需要做更新一次。

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

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

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

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

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

【編輯推薦】

  1. C#跳躍語句學(xué)習(xí)經(jīng)驗(yàn)
  2. 簡(jiǎn)單描述C#哈希值
  3. 如何用C#和ADO.NET訪問
  4. C#建立Web Service
  5. 淺析C# 匿名方法
責(zé)任編輯:佚名 來源: 博客園
相關(guān)推薦

2011-09-21 10:56:31

C#結(jié)構(gòu)

2009-08-07 11:26:53

C#數(shù)組結(jié)構(gòu)

2009-08-12 11:24:25

C# String對(duì)象

2009-08-19 17:12:18

C# Connecti

2009-08-31 09:37:09

C# Employee

2009-08-25 16:16:43

C# oledbcon

2009-08-26 15:46:01

C#匿名類型

2009-08-06 15:30:23

C#類型系統(tǒng)

2009-08-14 17:58:05

C#接口方法

2009-08-26 13:15:38

C#選擇控制

2009-09-02 15:41:21

C# HTTPWebR

2009-08-20 10:24:52

C#開發(fā)WinForm

2009-08-10 10:04:25

C#抽象類C#接口

2009-08-10 14:55:04

C#定義Nullabl

2009-08-18 17:08:50

C#編寫XML文檔

2009-08-25 13:26:49

C#編寫asp+

2009-08-27 14:44:11

C# interfac

2009-09-04 11:00:13

通過C#引用傳遞

2009-08-19 17:45:26

C#使用GDI+

2009-09-02 16:23:27

C# Singleto
點(diǎn)贊
收藏

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