.NET のスレッドセーフな HashSet 代替手段
この記事では、.NET で HashSet
コレクションを管理するためのスレッドセーフなアプローチを検討し、手動ロックの代替手段を提供します。 この例では、 HashSet
操作にカスタム ロックを使用しています。これは有効ですが、エラーが発生しやすい方法です。 より良いオプションを検討してみましょう。
.NET
フレームワークは、優れたソリューションとして ConcurrentDictionary
名前空間内に System.Collections.Concurrent
クラスを提供します。 ConcurrentDictionary
はスレッドセーフなハッシュ テーブル機能を提供し、同時読み取りと書き込みを効率的に処理します。 使用方法は次のとおりです:
<code class="language-csharp">private ConcurrentDictionary<string, byte[]> _data;</code>
または、カスタム ConcurrentHashSet
クラスを作成することもできます。このアプローチには、スレッドの安全性を保証するための内部ロック機構が含まれます。 サンプル実装を以下に示します:
<code class="language-csharp">public class ConcurrentHashSet<T> : IDisposable { private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); private readonly HashSet<T> _hashSet = new HashSet<T>(); public bool Add(T item) { ... } //Implementation as in original example public void Clear() { ... } //Implementation as in original example public bool Contains(T item) { ... } //Implementation as in original example public bool Remove(T item) { ... } //Implementation as in original example public int Count { ... } //Implementation as in original example public void Dispose() { ... } //Implementation as in original example protected virtual void Dispose(bool disposing) { ... } //Implementation as in original example ~ConcurrentHashSet() { ... } //Implementation as in original example }</code>
(注: ...
は、簡潔にするために元の例のコードをここに挿入する必要があることを示します)。
ConcurrentDictionary
または適切に実装された ConcurrentHashSet
を使用すると、コードの明瞭さが大幅に向上し、手動ロックと比較して同期エラーのリスクが軽減されます。 これらの組み込みソリューションは、パフォーマンスとスレッドの安全性を考慮して最適化されています。
以上が.NET でスレッドセーフな HashSet 操作を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。