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

淺談C# ReaderWriterLock

開發(fā) 后端
這里介紹后來我干脆不用C# ReaderWriterLock了,直接換成了LockFree的方法。在C#中實現(xiàn)LockFree其實是很簡單的,因為有了Garbage Collection。

前一陣在一個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)這其實不是。NET designer的錯,根本沒辦法把這個operation設(shè)計成atomic的。原因如下:

很多個thread同時acquire到了ReaderLock,

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

后來我干脆不用C# ReaderWriterLock了,直接換成了LockFree的方法。在C#中實現(xiàn)LockFree其實是很簡單的,因為有了Garbage 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行,建造一個新的字典對象的基礎(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有研究的或者有興趣的可以留言大家討論討論

【編輯推薦】

  1. C#跳躍語句學(xué)習(xí)經(jīng)驗
  2. 簡單描述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-19 17:12:18

C# Connecti

2009-08-31 09:37:09

C# Employee

2009-08-12 11:24:25

C# String對象

2009-08-25 16:16:43

C# oledbcon

2009-09-02 15:41:21

C# HTTPWebR

2009-08-14 17:58:05

C#接口方法

2009-08-26 15:46:01

C#匿名類型

2009-08-20 10:24:52

C#開發(fā)WinForm

2009-08-06 15:30:23

C#類型系統(tǒng)

2009-08-26 13:15:38

C#選擇控制

2009-08-10 10:04:25

C#抽象類C#接口

2009-08-28 15:58:54

C#窗體里調(diào)用

2009-09-02 16:23:27

C# Singleto

2009-08-25 13:26:49

C#編寫asp+

2009-08-24 17:24:28

C#創(chuàng)建XML文檔

2009-08-19 17:45:26

C#使用GDI+

2009-09-04 11:00:13

通過C#引用傳遞

2009-08-11 13:13:09

C#和Java比較
點贊
收藏

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