私は C でプログラムを書いています。簡単に言うと、多くのスレッドが読み書きできる変数がいくつかあります。これらのいずれかが書き込まれるたびに、アトミック スワップ (GCC アトミック操作、同期およびスワップ) を介して書き込まれます。これらの変数のいずれかを読み取るたびにアトミック ロードを使用する必要がありますか?それとも、アトミック ライトは書き込み中のデータの読み取りを回避するのに十分ですか?
これらの変数のいずれかからのデータを使用する必要がある場所では、最初に値をコピーすることに注意してください。
int success = 0;
while ( !success ) {
int x = shared_x;
... work with x, result in y ...
success = cmp_swap( &shared_x, x, y );
}
私の質問はデータ競合に関するものではありません。つまり、データが失われる可能性はありません。私の懸念は、shared_x の値が読み取りの途中で変わる可能性があることです。これが 8 バイト整数であるとします。これは潜在的な問題になるでしょうか。shared_x が 64 ビット整数、8 バイトであるとします。my x = shared_x が最初の 4 バイトをコピーし、次に何かがアトミックに shared_x に書き込み、このステートメントが 2 番目の 4 バイトの読み取りを終了する可能性はありますか。これにより、x には、shared_x の古い値の最初の 4 バイトと、新しい shared_x の最後の 4 バイトが含まれます。アトミック スワップ ( http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html - __sync_bool_compare_and_swap を使用) のメモリ バリアは、これを防ぐのに十分だと思います... しかし、私はわかりません。