0

x86-64 アーキテクチャでは、2 つのコアがあり、各コアには次のようなことを行うスレッドがあります: 共有値を比較して交換し (共有値が 0 の場合はテストし、1 に変更します)、次に別のことを行います。その後、単純なスピンロックのように、(ループ内で) 値を再び 0 に設定します。問題があります。core-1 が値を 1 に設定し、core-2 が待機中 (値をテスト) であり、次に core-1 が値を 0 に設定すると、CPU はタイムラインでそのようなことを行う可能性があります ( core-1 は val を 0 に設定します):

time 0: core-1 set the new value to store buffer, and send "read invalidate" message to core-2
time 1: core-2 got msg and save it to invalidate queue, send ACK to core-1
time 2: core-1 got ACK flush store buffer
time 1.5 or 2.5 : core 2 flush invalidate queue

したがって、時間 0.5 でコア 1 が値を再度読み取った場合、新しいデータを取得できますが、コア 2 はまだダーティ データを取得しています。これは私の推測ですが、このように発生しますか? 「はい」の場合、問題を解決するにはどうすればよいですか? 私は、メモリバリアまたはロックバスが何か助けになるとは思わない.さらに、c++ 11 std::atomic 値にはそのような問題がありますか?

4

0 に答える 0