アプリケーションのマルチスレッド サポートを構築しています。
私のアプリケーションでは、ワーカーが別のワーカーの「作業フィールド」にアクセスして、自分のジョブを完了する必要がある場合があります。pthread ミューテックスを使用してこれを安全にしようとしましたが、ワーカーが 1 つしかなく競合がない場合でも、非常に遅いことが判明しました。
そこで、私は別のアイデアを思いつきました。ワーカーにジョブを可能な限り完了させてから、(ワーカーごとの、独自の) キューに前述の問題のあるジョブを追加します。すべてのワーカーが完了すると、メイン スーパーバイザー スレッドが未完了のジョブを完了します。それらが労働者によって行われた仕事の数よりも桁違いに少ないことを願っています.
私の質問は、実行をスーパーバイザーからワーカーに、またはその逆に転送するときに、メモリ フェンスを投入する必要があるかどうかです。
編集: 詳細 (コードはgithubにあります。pool::collision_wsc() を参照してください)。各スレッドは、さまざまな「セル」(基本的には std::vector) からポインターを読み取り、ポイントされたオブジェクトに何らかの操作を適用します (ハード球間の衝突)。
要点は、セルは隣接するセル (の一部) と相互作用しますが、これらのセルの一部は別のワーカーの所有物である可能性があります (1 つの球がセルの境界近くにあり、別のセルの 1 つと衝突する可能性があります)。