キューを使用するべきではない状況

キューを使用するべきではない状況#

キューは、生産タスクから消費タスクをバッファーするために並列プログラムで広く使用されています。ただし、明示的なキューを使用する前に、parallel_for_eachparallel_pipeline を使用することを検討してください。これらの操作は、多くの場合、次の理由によりキューより効率的です。

  • キューは先入先出順 (FIFO) を維持する必要があるため、本質的にボトルネックになります。

  • 値を pop しているスレッドは、値が push されるまでアイドル状態で待機する必要がある場合があります。

  • キューは受動的なデータ構造です。スレッドが値を push した場合、値を pop するまで時間がかかり、値 (およびその参照) はキャッシュにない「コールド」状態になります。また、さらに悪い状況では、別のスレッドが値を pop し、値 (およびその参照) を別のプロセッサーに移動しなければなりません。

これに対し、parallel_pipeline はこれらのボトルネックを回避します。スレッド化は暗黙的であるため、値が現れるまでほかのワークを実行するようにワーカースレッドを最適化します。また、キャッシュ上の項目をホットな状態で維持しようとします。