5

我正在寻找一个比较器运算符,可用于在 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是原子操作?

4

1 回答 1

5

这是不可能的,因为它没有任何意义。

您的代码将获得用于比较的有效值,但它几乎不能保证何时获得这些值。因此,如果检查成功,您将只知道readIdx在某个时间点等于某个时间writeIdx + 1点产生的值。这两个时间点大多是不相关的。特别是,允许​​在任何一个时间点 的值都不readIdx等于 的值,writeIdx + 1但检查仍然成功。

这就是为什么这不是一个真正的问题:如果不引入额外的锁,您将无法同时建立两个原子相等的概念。问题是任何依赖于该条件的代码都必须是执行检查的同一原子执行块的一部分。如果不是,则条件可能会在代码完成执行之前发生变化。

另一方面,如果代码的任何部分都不依赖于条件,那么首先将其作为一个概念引入是没有意义的。

所以这里是如何继续:返回并重新评估您是否真的有代码,这取决于两个变量在代码执行时必须具有预期值的条件。如果是这种情况,您需要用锁保护该代码。如果没有,您可能根本不需要检查条件,因为您当前代码提供的保证可能太弱而无法真正使用。

于 2013-11-12T12:52:45.497 回答