首页 > 解决方案 > C++:在不使用锁的情况下比较 2 个整数变量时如何避免竞争条件

问题描述

我有 3 个共享整数变量,它们正在多线程代码中写入/读取。
类似的事情发生在共享代码中。如何在不依赖锁的情况下使线程 2 操作免于数据竞争?使用锁会影响我的运行时,这是遗留代码,所以我不能真正移动到 std::atomic。

最初 :

int var1 = 0, var2 = 0, var3 = 0;

稍后的线程 1 会:

 __sync_fetch_and_add(&var1, 1);

线程:2

 var3 =  var1 > var2 ? var1 : var2 ;

线程 3:

 __sync_fetch_and_add(&var2, 1);

线程 4

 __sync_fetch_and_sub(&var1, 1);

标签: c++multithreading

解决方案


如果可能的话,我强烈建议转移到 std::atomic 。

否则,实现将是特定于硬件的。例如,您可以为此使用带有 LOCK 前缀的 x86 XADD 指令,它适用于 32 位和 64 位平台(从 486 处理器开始)。下面的代码将与 GCC 编译器一起使用:

static inline int fetch_and_add(int* variable, int value)
{
    __asm__ volatile("lock; xaddl %0, %1"
      : "+r" (value), "+m" (*variable) // input + output
      : // No input-only
      : "memory"
    );
    return value;
}

推荐阅读