4

複数のスレッドを同時に実行し、独自のオブジェクトのフィールドの値をチェックしています。フィールドは、起動スレッドによって次のように設定されます。

for (i = 0; i < ThreadCount; i++)
{
    ThreadContext[i].MyField = 1;
}

各スレッド内で、この値の値を確認します。

if (MyField == 1)
{
   ...//do something
}

ただし、4 コア CPU では、変更された MyField を確認するために、(4) 実行中のスレッドの一部が数ミリ秒またはそれ以上の時間を必要とすることに気付きました。MyField は単一の char フィールドです。何が起こっているように見えるかというと、変更を検出した最初のスレッドによってメモリ バスが使い果たされると、他のすべてのスレッドが、最初の実行のほぼ全期間にわたって停止する可能性があるということです。(十分なメモリ プレッシャがあると仮定します)。最初のスレッドがメモリを解放したとき (およびレジスタをさらに処理したとき) にのみ、他のスレッドも新しい値を認識できるようになります。

私はasmをチェックしましたが、途中でコンパイラの最適化はありません。呼び出しは直接メモリに送られます。これはどのように修正できますか?

ありがとう!混雑する

4

1 に答える 1

1

Intel からフィードバックを受け取りました: はい、そのように動作します (簡単な修正はありません)。

于 2011-05-25T10:32:44.250 に答える