マルチプロセッササーバーで共有メモリを使用してプロセス間通信を行っています。コードを次のように簡略化しました。
struct MyStruct {
uint64_t x;
};
volatile MyStruct* my_struct; // initialized elsewhere
void MyFunction(uint64_t y) {
while (true) {
uint64_t current_x = my_struct->x;
if (__sync_bool_compare_and_swap(&my_struct->x, current_x, y)) {
DoWork(current_x, y); // do work here depending on current_x and y
return;
}
}
}
私の質問: このコードは正しいですか?
特に、追加する必要がありますか
__sync_synchronize()
行の前に
uint64_t current_x = my_struct->x
それとも、次の行のアトミック CAS が効果的にそれを行うため、冗長になりますか? ご覧のとおり、私が実質的に必要としているのは __sync_lock_test_and_set 機能です。ただし、http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.htmlから、その機能が常に期待どおりに機能しない可能性があるようです。