C / C ++共享内存,原子操作,Linux

时间:2012-07-10 02:02:38

标签: c++ c linux atomic inter-process-communicat

我正在使用多处理器服务器上的共享内存进行进程间通信。我已将代码简化为以下内容:

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开始,看起来该函数可能无法按预期工作。

1 个答案:

答案 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_xy