成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談C# ReaderWriterLock

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

前一陣在一個project中使用了C# ReaderWriterLock,發現了兩個問題:

Performance非常差

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

很多個thread同時acquire到了ReaderLock,

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

后來我干脆不用C# ReaderWriterLock了,直接換成了LockFree的方法。在C#中實現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行,建造一個新的字典對象的基礎上原有的物件。為oldDict ,這一步是只讀的,而且不需要鎖,

第18行,執行更新操作后,新建造的對象,

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

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

如果我們想用LockFree數據結構C++中,還有另一種技術稱為危害指針。這是在IBM的研究論文。

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

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

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

【編輯推薦】

  1. C#跳躍語句學習經驗
  2. 簡單描述C#哈希值
  3. 如何用C#和ADO.NET訪問
  4. C#建立Web Service
  5. 淺析C# 匿名方法
責任編輯:佚名 來源: 博客園
相關推薦

2011-09-21 10:56:31

C#結構

2009-08-07 11:26:53

C#數組結構

2009-08-12 11:24:25

C# String對象

2009-08-31 09:37:09

C# Employee

2009-08-19 17:12:18

C# Connecti

2009-08-26 13:15:38

C#選擇控制

2009-08-26 15:46:01

C#匿名類型

2009-08-25 16:16:43

C# oledbcon

2009-08-14 17:58:05

C#接口方法

2009-08-20 10:24:52

C#開發WinForm

2009-09-02 15:41:21

C# HTTPWebR

2009-08-06 15:30:23

C#類型系統

2009-08-10 10:04:25

C#抽象類C#接口

2009-08-24 17:24:28

C#創建XML文檔

2009-08-25 13:26:49

C#編寫asp+

2009-08-28 15:58:54

C#窗體里調用

2009-09-02 16:23:27

C# Singleto

2009-09-04 11:00:13

通過C#引用傳遞

2009-09-17 17:13:54

C#數組

2009-08-18 17:08:50

C#編寫XML文檔
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线欧美一区二区 | 91在线看网站 | 日韩在线高清 | 日韩蜜桃视频 | 国产福利视频网站 | 午夜视频一区二区三区 | 成人免费视屏 | 特黄视频| 成年人黄色一级片 | 色就干| 一区二区在线观看av | 日韩人体视频 | 爱爱免费视频 | 米奇狠狠鲁 | 91视频在线看 | 日日干日日操 | 欧美黄色片 | 手机av网| 亚洲国产一区二区视频 | 亚洲国产精品久久久久婷婷老年 | 亚洲国产精品一区二区久久 | 四虎在线视频 | 女人牲交视频一级毛片 | 成人综合视频在线观看 | 欧美日韩一区二区三区四区五区 | 午夜天堂精品久久久久 | 91久久国产综合久久 | 中文字幕a√ | 欧美精品video | 国产高清视频在线观看 | 在线免费毛片 | 不用播放器看的av | 成人无遮挡毛片免费看 | 国产一区二区免费电影 | 中文字幕在线一区二区三区 | 日韩一区二区三区视频 | 久久久国产一区二区三区四区小说 | 成人在线亚洲 | 91精品国产91久久久久久 | 国产乱xxav| 午夜黄色影院 |