次の方法で共有


並列プログラミングのデータ構造

.NET には、同時実行コレクション クラスのセット、軽量同期プリミティブ、遅延初期化の型など、並列プログラミングで役立ついくつかの型が用意されています。 これらの型は、タスク並列ライブラリや PLINQ など、マルチスレッド アプリケーション コードと共に使用できます。

同時実行コレクション クラス

System.Collections.Concurrent名前空間のコレクション クラスは、可能な限りロックを回避し、ロックが必要な場合はきめ細かいロックを使用する、スレッド セーフな追加および削除操作を提供します。 同時実行コレクション クラスでは、ユーザー コードが項目にアクセスするときにロックを取得する必要はありません。 同時実行コレクション クラスは、複数のスレッドがコレクションに項目を追加および削除するシナリオで、 System.Collections.ArrayListSystem.Collections.Generic.List<T> (ユーザーが実装したロックを使用) などの型よりもパフォーマンスを大幅に向上させることができます。

次の表に、同時実行コレクション クラスの一覧を示します。

タイプ 説明
System.Collections.Concurrent.BlockingCollection<T> System.Collections.Concurrent.IProducerConsumerCollection<T>を実装するスレッド セーフなコレクションのブロック機能と境界機能を提供します。 使用可能なスロットがない場合、またはコレクションがいっぱいの場合、プロデューサー スレッドはブロックします。 コレクションが空の場合、コンシューマー スレッドはブロックします。 この型では、コンシューマーとプロデューサーによる非ブロッキング アクセスもサポートされます。 BlockingCollection<T> は、基底クラスまたはバッキング ストアとして使用して、 IEnumerable<T>をサポートするすべてのコレクション クラスのブロックと境界を提供できます。
System.Collections.Concurrent.ConcurrentBag<T> スケーラブルな追加操作と取得操作を提供するスレッド セーフなバッグ実装。
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> 同時実行およびスケーラブルなディクショナリ型。
System.Collections.Concurrent.ConcurrentQueue<T> 同時実行およびスケーラブルな FIFO キュー。
System.Collections.Concurrent.ConcurrentStack<T> 同時実行およびスケーラブルな LIFO スタック。

詳細については、「 コレクションのThread-Safe」を参照してください。

同期プリミティブ

System.Threading名前空間の同期プリミティブを使用すると、従来のマルチスレッド コードで見つかった高価なロック メカニズムを回避することで、きめ細かなコンカレンシーと高速なパフォーマンスを実現できます。

次の表に、同期の種類を示します。

タイプ 説明
System.Threading.Barrier 複数のスレッドが、各タスクがその到着を通知できるポイントを提供し、一部またはすべてのタスクが到着するまでブロックすることで、1 つのアルゴリズムで並列に動作できるようにします。 詳細については、「 バリア」を参照してください。
System.Threading.CountdownEvent 簡単なランデブー メカニズムを提供することで、フォークと結合のシナリオを簡略化します。 詳細については、「 CountdownEvent」を参照してください。
System.Threading.ManualResetEventSlim System.Threading.ManualResetEventに似た同期プリミティブ。 ManualResetEventSlim は軽量ですが、プロセス内通信にのみ使用できます。
System.Threading.SemaphoreSlim リソースまたはリソースのプールに同時にアクセスできるスレッドの数を制限する同期プリミティブ。 詳細については、「 Semaphore と SemaphoreSlim」を参照してください。
System.Threading.SpinLock ロックを取得しようとしているスレッドが、量子を生成する前に一定期間、ループまたは スピンで待機する相互除外ロック プリミティブ。 ロックの待機が短いと予想されるシナリオでは、 SpinLock は他の形式のロックよりも優れたパフォーマンスを提供します。 詳細については、「 SpinLock」を参照してください。
System.Threading.SpinWait 指定した時間スピンし、最終的にスピン数を超えた場合にスレッドを待機状態にする軽量の小さい型。 詳細については、「 SpinWait」を参照してください。

詳細については、以下を参照してください。

遅延初期化クラス

遅延初期化では、オブジェクトのメモリは、必要になるまで割り当てされません。 遅延初期化では、プログラムの有効期間全体にわたってオブジェクトの割り当てを均等に分散することで、パフォーマンスを向上させることができます。 任意のカスタム型に対して遅延初期化を有効にするには、 Lazy<T>型をラップします。

次の表に、遅延初期化の種類を示します。

タイプ 説明
System.Lazy<T> 軽量でスレッド セーフな遅延初期化を提供します。
System.Threading.ThreadLocal<T> 初期化関数を遅延的に呼び出す各スレッドを使用して、スレッドごとに遅延初期化値を提供します。
System.Threading.LazyInitializer 専用の遅延初期化インスタンスを割り当てる必要を回避する静的メソッドを提供します。 代わりに、参照を使用して、アクセス時にターゲットが初期化されていることを確認します。

詳細については、「 遅延初期化」を参照してください。

例外の集計

System.AggregateException型を使用すると、個別のスレッドで同時にスローされる複数の例外をキャプチャし、それらを 1 つの例外として結合スレッドに返すことができます。 System.Threading.Tasks.Task型とSystem.Threading.Tasks.Parallel型と PLINQ では、この目的のためにAggregateException広く使用されています。 詳細については、「 例外処理 」および「 方法: PLINQ クエリで例外を処理する」を参照してください

こちらも参照ください