ホームページ > バックエンド開発 > C++ > .NET Framework でスレッドセーフな HashSet 機能を実現するにはどうすればよいですか?

.NET Framework でスレッドセーフな HashSet 機能を実現するにはどうすればよいですか?

DDD
リリース: 2025-01-09 06:43:43
オリジナル
130 人が閲覧しました

How to Achieve Thread-Safe HashSet Functionality in the .NET Framework?

.NET Framework のスレッドセーフな HashSet 代替手段

標準の .NET Framework HashSet<T> はスレッドセーフではありません。 同時アクセスにより、予期しない動作が発生する可能性があります。 スレッドセーフな操作のためのソリューションを探ってみましょう。

手動ロック (あなたのアプローチ):

メソッドは lock ステートメントを使用して、HashSet<string> へのアクセスを同期します。これは機能しますが、各操作の明示的なロックによりパフォーマンスのオーバーヘッドが追加されます。

優れたスレッドセーフ オプション:

.NET には直接的な ConcurrentHashSet<T> がありませんが、実行可能な代替手段が存在します。

  1. ConcurrentDictionary<TKey, TValue>:

    これは有力な候補です。 必要なのはキー (文字列) だけであるため、ConcurrentDictionary<string, byte> を使用できます。byte 値は基本的にプレースホルダーです。

    <code class="language-csharp">private ConcurrentDictionary<string, byte> _data = new ConcurrentDictionary<string, byte>();</code>
    ログイン後にコピー
  2. カスタム ConcurrentHashSet<T> 実装:

    独自のスレッドセーフな HashSet を構築できます。 サンプル コードでは、読み取りおよび書き込み操作を効率的に処理し、競合を最小限に抑えるために ReaderWriterLockSlim を使用している可能性があります。

  3. ConcurrentBag<T> (通常は避けてください):

    ConcurrentBag<T> は、要素の正確な追加と削除には適しておらず、プロデューサーとコンシューマーのパターンに適しています。この使用例には推奨されません。

正しいアプローチの選択:

最適な選択は、パフォーマンスのニーズ、実装の複雑さ、信頼性の期待によって異なります。 ほとんどの場合、ConcurrentDictionary<string, byte> はシンプルさとパフォーマンスのバランスが取れています。 カスタム実装では、より詳細な制御が可能になりますが、より多くの労力が必要になります。 この特定のシナリオでは ConcurrentBag<T> を避けてください。

以上が.NET Framework でスレッドセーフな HashSet 機能を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート