gpt4 book ai didi

C中原子变量的比较

转载 作者:太空宇宙 更新时间:2023-11-04 11:58:41 25 4
gpt4 key购买 nike

我有 2 个原子变量:

atomic_ulong overwrap_cnt = 0;
atomic_ulong overwrap_read_cnt = 0;

一个线程做 overwrap_cnt 的增加(一次):

overwrap_cnt++;

另一个线程在无限循环中进行比较:

while(1)
{
if (overwrap_read_cnt == overwrap_cnt)
{
printf("or:%lu, ow:%lu \n",overwrap_read_cnt, overwrap_cnt);
}
usleep(100000);
}

但是,结果总是如下:

or:0, ow:1
or:0, ow:1
or:0, ow:1

不知何故,在比较过程中变量是相等的,但是当我们打印它们时——我们看到它们是不同的。每次迭代的结果都相同。

我不能像这样比较原子变量吗?或者有什么问题?

它在带有 gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6) 的 centos 7.5 上

谢谢。

最佳答案

虽然变量是单独原子的,但您的比较循环不是。也许与直觉相反,读取原子变量可能会生成比读取非原子变量更多的指令。

例如,如果您使用 GCC 的原子内置函数编写了具有相同行为的代码:

while(1)
{
unsigned long _tmp1 = __atomic_load_n(&overwrap_read_cnt, __ATOMIC_RELAXED);
unsigned long _tmp2 = __atomic_load_n(&overwrap_cnt, __ATOMIC_RELAXED);
if (_tmp1 == _tmp2)
{
_tmp2 = __atomic_load_n(&overwrap_cnt, __ATOMIC_RELAXED);
_tmp1 = __atomic_load_n(&overwrap_read_cnt, __ATOMIC_RELAXED);
printf("or:%lu, ow:%lu \n", _tmp1, _tmp2);
}
usleep(100000);
}

虽然为比较获取的值被确定为相等,但它们在为 printf 调用再次获取时可能不再相等。

如果你想确保后面使用的值与 if 语句中的值相同,你应该只获取它们一次,然后在循环迭代的其余部分使用缓存的值。

关于C中原子变量的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53309942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com