3

循環キューを共有する2つのスレッドがあります。キューの内容は符号なしの数値です(unsigned longx86_64上)。1つのスレッドはプロデューサーで、もう1つのスレッドはコンシューマーです。プロデューサーは、キュー内の要素の値が0の場合にのみキューの要素に書き込み、プロデューサーは常にゼロ以外の値を生成しますが、コンシューマーはその値がゼロ以外の場合にのみそれを消費します。また、コンシューマーは要素を消費するたびに0にリセットするため、プロデューサーはコンシューマーが要素を消費したことを知ることができます。

このスキームでは、キュー内の要素のアクセス順序が厳密であるため、同期変数やアトミック変数を使用する必要がないということです。私の仮定は正しいですか?それとも私はここで何かが足りないのですか?x86_64には比較的厳密な整合性メモリモデルがあり、ストアの前に配置できるのは無関係の負荷のみであることに注意してください。また、キャッシュをプロアクティブに更新するキャッシュコヒーレンシも備えています。またvolatile、コンパイラが変数をキャッシュしないようにするために変数を使用します。

4

3 に答える 3

3

はい、同期が必要です。コンシューマーがプロデューサーに追いついた場合、またはその逆の場合、プロデューサーとコンシューマーが同時に同じ場所に読み書きしようとしている可能性があるためです。

使用しているデータ型に対してプロセッサがアトミック操作を実行する場合でも、スレッドが異なるコアで実行されている場合でも、適切なメモリ バリアを取得して一貫性を確保するために、(適切な API を介して) アトミック操作を明示的に要求する必要があります。

于 2012-04-22T09:39:09.863 に答える
2

同期やアトミック変数は必要ないと思います。

2 つのスレッド 1 つのプロデューサーと 1 つのコンシューマーは、同じエントリの書き込みと競合しません。

サイクル キューの実装が適切である場合 (たとえば、1 つの読み取りヘッダー変数、1 つの書き込みタグ変数など)、2 つのスレッドが同じ場所で動作できないためです。エントリ構造を制限する必要はありません。

また、読んだ後にエントリをリセットする必要はないようです。読み取りヘッダーを移動する必要があるため、プロデューサー スレッドは、読み取りヘッダー変数と書き込みタグ変数を比較することで、1 つのエントリを書き込むことができるかどうかを知ることができます。

お役に立てますように:)

于 2012-04-22T09:42:47.613 に答える
0

プロデューサーとコンシューマーが 1 つの変数のみにアクセスする場合、同期は必要ないようです。しかし、循環バッファーを使用すると言ったので、インデックスを使用します。同期されていない場合、インデックス変数は脆弱です。

于 2012-04-22T09:45:51.430 に答える