日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何实现一个线程安全的 ConcurrentHashSet ?

發布時間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何实现一个线程安全的 ConcurrentHashSet ? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

咨詢區

  • Sebastian

在 .NET 框架中并沒有線程安全的 ConcurrentHashSet 類,我想模仿 ConcurrentDictionary 來實現一個,目前寫了一下樁代碼。

public?class?ConcurrentHashSet<TElement>?:?ISet<TElement> {private?readonly?ConcurrentDictionary<TElement,?object>?_internal;public?ConcurrentHashSet(IEnumerable<TElement>?elements?=?null){_internal?=?new?ConcurrentDictionary<TElement,?object>();if?(elements?!=?null)UnionWith(elements);}public?void?UnionWith(IEnumerable<TElement>?other){if?(other?==?null)?throw?new?ArgumentNullException("other");foreach?(var?otherElement?in?other)Add(otherElement);}public?bool?Add(TElement?item){return?_internal.TryAdd(item,?null);}//?I?am?not?sure?here?if?that?fullfills?contract?correctlyvoid?ICollection<TElement>.Add(TElement?item){Add(item);}public?bool?Contains(TElement?item){return?_internal.ContainsKey(item);}public?bool?Remove(TElement?item){object?ignore;return?_internal.TryRemove(item,?out?ignore);}public?int?Count{get?{?return?_internal.Count;?}}public?IEnumerator<TElement>?GetEnumerator(){return?_internal.Keys.GetEnumerator();} }

我不確定這代碼能否在 foreach 中還能保證原子性,請問是否有更好的實現?

回答區

  • Ben Mosher

我最近遇到了類似的場景,不過我更關注的更高性能的 Add,Contains,Remove 方法,下面是我的實現。

using?System.Collections.Generic; using?System.Threading;namespace?BlahBlah.Utilities {public?class?ConcurrentHashSet<T>?:?IDisposable{private?readonly?ReaderWriterLockSlim?_lock?=?new?ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);private?readonly?HashSet<T>?_hashSet?=?new?HashSet<T>();#region?Implementation?of?ICollection<T>?...ishpublic?bool?Add(T?item){try{_lock.EnterWriteLock();return?_hashSet.Add(item);}finally{if?(_lock.IsWriteLockHeld)?_lock.ExitWriteLock();}}public?void?Clear(){try{_lock.EnterWriteLock();_hashSet.Clear();}finally{if?(_lock.IsWriteLockHeld)?_lock.ExitWriteLock();}}public?bool?Contains(T?item){try{_lock.EnterReadLock();return?_hashSet.Contains(item);}finally{if?(_lock.IsReadLockHeld)?_lock.ExitReadLock();}}public?bool?Remove(T?item){try{_lock.EnterWriteLock();return?_hashSet.Remove(item);}finally{if?(_lock.IsWriteLockHeld)?_lock.ExitWriteLock();}}public?int?Count{get{try{_lock.EnterReadLock();return?_hashSet.Count;}finally{if?(_lock.IsReadLockHeld)?_lock.ExitReadLock();}}}#endregion#region?Disposepublic?void?Dispose(){if?(_lock?!=?null)?_lock.Dispose();}#endregion} }

點評區

實現一個 ConcurrentSet<T> 其實蠻有必要的,你在 github 或者其他第三方網站上會找到很多類似的 ConcurrentSet<T> 的實現,比如:https://pastebin.com/8REHRFFL

總結

以上是生活随笔為你收集整理的如何实现一个线程安全的 ConcurrentHashSet ?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。