.NET での同時 HashSet 機能の実現
.NET Framework は、同時実行 HashSet 実装を直接提供しません。 ただし、いくつかの回避策により、スレッド セーフによる同様の機能が提供されます。
最適なソリューション: ConcurrentDictionary
ConcurrentDictionary<TKey, TValue>
内の System.Collections.Concurrent
クラスが推奨されるアプローチです。 メモリ使用量を最適化するには、値の型として byte
を使用します。 これにより、キーだけではなくキーと値の構造が使用されますが、HashSet の動作をミラーリングするスレッドセーフな操作が提供されます。
<code class="language-csharp">private ConcurrentDictionary<string, byte> _data;</code>
カスタム実装 (上級)
カスタムの同時実行 HashSet を構築し、ロックなどのメカニズムを通じてスレッドの安全性を確保できます。 ただし、これには慎重な検討と徹底的なテストが必要です。 標準の HashSet
での読み取り操作であっても、本質的にスレッドセーフではないことに注意してください。
<code class="language-csharp">using System; using System.Collections.Generic; using System.Threading; namespace BlahBlah.Utilities { public class ConcurrentHashSet<T> : IDisposable { // ... (implementation omitted for brevity) } }</code>
同時バッグを避ける
ConcurrentBag<T>
の使用は強く推奨されません。 そのスレッドセーフな操作は任意の要素の追加と削除に限定されているため、HashSet のような動作 (存在のチェックなど) を必要とするシナリオには適していません。 これは主に生産者と消費者のパターン向けに設計されています。
以上が.NET Framework で同時 HashSet を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。