構造の一部のメンバーに同期を提供する必要があります。
私はプロセッサからの書き込み変数へのアクセスを同期する
obj.Value1 = 5; // Processor B
はにすぐに見えるようにすることを望ん構造は、この
struct SharedStruct {
int Value1;
int Value2;
}
のようなものであると私はグローバル変数
SharedStruct obj;
を持っている場合他のプロセッサーなので、値をテストすると
if(obj.Value1 == 5) { DoSmth(); } // Processor A
else DoSmthElse();
キャッシュから古い値ではなく新しい値を取得します。
値を書き込んだり読んだりすると、の揮発性のを使用すれば十分です。しかし、私は揮発性がこのような種類の問題を解決することはできないと読んでいます。
メンバーは2/4/8バイト境界で正しくアライメントされていることが保証されています。この場合、書き込みはアトミックでなければなりませんが、キャッシュがどのようにこれに干渉するかはわかりません。
メモリ障壁(mfence、sfenceなど)を使用すれば十分でしょうか?または、いくつかのインターロック操作が必要ですか?
それとも
lock mov addr, REGISTER
のようなもの?
たぶん私は少しを明確にすべき:(
編集
最も簡単には明らかにいくつかのロック機構になりますが、速度が重要であり、ロックを余裕はありません。値が(一度だけ設定されているフラグのように振る舞います)。他のすべてのスレッドはそれを読んでする必要があります。私はそれがロックを使用せずに、この新しい値の読み取りを強制する方法であってもよいことだと思う理由です。事前に
ありがとう!
答えをありがとう。このような何か私は聞くことを望んでいた:) –