我正在寻找一个比较器运算符,可用于在C ++ 11下原子地比较两个原子变量。在这里,我不想交换存储在这些原子obj下的值,所以我对compare_and_swap函数不感兴趣。 请参考下面的例子:
std::atomic<uint32_t> readIdx{0};
std::atomic<uint32_t> writeIdx{0};
while(writeIdx + 1 == readIdx) <<<<------------------
{
std::this_thread::yield();
}
我想要的只是用箭头线表示的代码是原子的。可能吗?
如果不是,writeIdx == readIdx
是原子操作吗?
答案 0 :(得分:4)
这是不可能的,因为它没有任何意义。
您的代码将获得有效的比较值,但它几乎不能保证何时获得这些值。因此,如果检查成功,您所知道的是readIdx
在某个时间点等于writeIdx + 1
在某个时间点产生的值。这两个时间点大多是无关的。特别是,允许在任何单一时间点readIdx
的值等于writeIdx + 1
的值,但检查仍然成功。
这就是为什么这不是一个真正的问题:你将无法在不引入额外锁定的情况下建立原子同时的概念。问题是,无论代码取决于该条件,都需要成为执行检查的同一原子执行块的一部分。如果不是,则在代码完成执行之前条件可能会发生变化。
另一方面,如果代码的任何部分都不依赖于条件,那么首先将它作为一个概念引入是没有意义的。
所以这里是如何继续:返回并重新评估您是否真的拥有依赖于两个变量在代码执行时必须具有预期值的条件的代码。如果是这种情况,您需要使用锁保护该代码。如果没有,您可能根本不需要检查条件,因为您当前代码提供的保证可能太弱而无法实际使用。