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

C/C++ shared memory, atomic operations, Linux

本文关键字:原子操作 Linux 内存 共享 C++      更新时间:2023-10-16

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

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看起来这个函数可能并不总是像预期的那样工作。

   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