c++ - 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);
解决方案
如果可能的话,我强烈建议转移到 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;
}
推荐阅读
- python - 嵌套字典与非嵌套字典的性能如何?(Python)
- machine-learning - 我想使用变量 A 的描述性文本并将它们与变量 B 的描述性文本相关联来预测 B。我该怎么做?
- java - 为什么将图像文件从 python 客户端传输到 java 服务器后无法传输字符串?
- python - 使用 Python 访问共享的 Outlook 子文件夹
- arrays - 如何从 JSON 数组中提取值?
- godot - 如何在 godot 3.1 中对 IK 应用约束
- twitter-bootstrap - 在 Bootstrap 4 中删除/取消设置默认 $colors (map-remove)
- javascript - 在 Chrome、Firefox 和 edge 中工作但在 IE 或 Sarfari 中不工作的编码
- html - Css:设置身体高度= 100%的页脚
- python-2.7 - 视频的 TFRecords