.NET Framework のスレッドセーフな HashSet 代替手段
標準の .NET Framework HashSet<T>
はスレッドセーフではありません。 同時アクセスにより、予期しない動作が発生する可能性があります。 スレッドセーフな操作のためのソリューションを探ってみましょう。
手動ロック (あなたのアプローチ):
メソッドは lock
ステートメントを使用して、HashSet<string>
へのアクセスを同期します。これは機能しますが、各操作の明示的なロックによりパフォーマンスのオーバーヘッドが追加されます。
優れたスレッドセーフ オプション:
.NET には直接的な ConcurrentHashSet<T>
がありませんが、実行可能な代替手段が存在します。
ConcurrentDictionary<TKey, TValue>
:
これは有力な候補です。 必要なのはキー (文字列) だけであるため、ConcurrentDictionary<string, byte>
を使用できます。byte
値は基本的にプレースホルダーです。
<code class="language-csharp">private ConcurrentDictionary<string, byte> _data = new ConcurrentDictionary<string, byte>();</code>
カスタム ConcurrentHashSet<T>
実装:
独自のスレッドセーフな HashSet を構築できます。 サンプル コードでは、読み取りおよび書き込み操作を効率的に処理し、競合を最小限に抑えるために ReaderWriterLockSlim
を使用している可能性があります。
ConcurrentBag<T>
(通常は避けてください):
ConcurrentBag<T>
は、要素の正確な追加と削除には適しておらず、プロデューサーとコンシューマーのパターンに適しています。この使用例には推奨されません。
正しいアプローチの選択:
最適な選択は、パフォーマンスのニーズ、実装の複雑さ、信頼性の期待によって異なります。 ほとんどの場合、ConcurrentDictionary<string, byte>
はシンプルさとパフォーマンスのバランスが取れています。 カスタム実装では、より詳細な制御が可能になりますが、より多くの労力が必要になります。 この特定のシナリオでは ConcurrentBag<T>
を避けてください。
以上が.NET Framework でスレッドセーフな HashSet 機能を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。