gcc 内置原子比较和交换
Posted
技术标签:
【中文标题】gcc 内置原子比较和交换【英文标题】:gcc builtin atomic compare and exchange 【发布时间】:2014-12-07 01:59:22 【问题描述】:我想使用 gcc 内置函数 __atomic_compare_exchange()
,但我需要它与指定的稍有不同,我不确定是否可以实现。
函数原型:
__atomic_compare_exchange(type *ptr, type *expected, type *desired, bool weak, int success_memmodel, int failure_memmodel)
它自动比较ptr
和expected
并将desired
写入ptr
如果ptr
== expected
我想要实现的非常相似,但我的expected
是!= NULL
,基本上我想检查ptr != NULL
是否正确,如果是这样,请将desired
写入ptr
。
这可以吗?
这是有关其用法的 gcc:
https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
【问题讨论】:
【参考方案1】:当然可以,但您只需要循环调用它即可。在每次循环迭代中,读取旧值。如果为空,则跳出循环并返回失败。如果它不为空,则使用该旧值作为原子比较和交换的“预期”。如果成功,则退出循环并返回成功。否则重复。
顺便说一下,这种通用方法是在比较和交换之上构建任意原子操作的方式。
【讨论】:
但是我失去了原子性,对我来说重要的是读取比较和写入都是原子的。如果不是,则存在竞争条件,即数据可以在读取、比较和写入之间发生变化 不,你不会失去原子性。这就是重点。原子比较和交换通过此方法为您提供所需的任何原子操作。如果数据在读取旧值(以获得“预期”)和原子 cas 之间发生变化,则 cas 失败并重新开始。以上是关于gcc 内置原子比较和交换的主要内容,如果未能解决你的问题,请参考以下文章