我正在使用多处理器服务器上的共享内存进行进程间通信。我已将代码简化为以下内容:
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开始,看起来该函数可能无法按预期工作。
答案 0 :(得分:0)
while (true) {
uint64_t current_x = my_struct->x;
/* CAVEAT: my_struct may point to something different now */
if (__sync_bool_compare_and_swap(&my_struct->x, current_x, y)) {
如果您不关心my_struct
可能指向不同的结构,但与原始结构具有相同的x
值,那么代码似乎没问题。看来你的代码暗示它没问题,因为你的DoWork
只关心current_x
和y
。