如何实现一个线程安全的 ConcurrentHashSet ?
生活随笔
收集整理的這篇文章主要介紹了
如何实现一个线程安全的 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 ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CacheManager - 用 C#
- 下一篇: 在非k8s 环境下 的应用 使用 Dap