Man*_*kla 5 c++ multithreading atomic c++11
我正在寻找一个比较器运算符,可用于在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();
}
Run Code Online (Sandbox Code Playgroud)
我想要的只是用箭头线表示的代码是原子的.可能吗?如果没有,那writeIdx == readIdx是原子操作吗?
这是不可能的,因为它没有任何意义。
您的代码将获得用于比较的有效值,但它几乎不能保证何时获得这些值。因此,如果检查成功,您所知道的就是readIdx在某个时间点等于某个writeIdx + 1时间点产生的值。这两个时间点大多不相关。特别是,允许在任何一个时间点 的值都不readIdx等于 的值writeIdx + 1但检查仍然成功。
这就是为什么这不是真正的问题:如果不引入额外的锁,您将无法同时建立两个原子相等的概念。问题是任何依赖于该条件的代码都需要成为执行检查的同一原子执行块的一部分。如果不是,则条件可能会在代码完成执行之前发生变化。
另一方面,如果代码的任何部分都不依赖于条件,那么首先将其作为一个概念引入是没有意义的。
所以这里是如何继续:返回并重新评估您是否真的有代码,这取决于两个变量在代码执行时都必须具有预期值的条件。如果是这种情况,您需要使用锁来保护该代码。如果没有,您可能根本不需要检查条件,因为您当前代码给出的保证可能太弱而无法真正使用。