std::atomic<int> g_atomic;
void thread0()
{
int oldVal = 0;
int newVal = 1;
while (g_atomic.compare_exchange_strong(oldVal, newVal, std::memory_order_acq_rel, std::memory_order_acquire))
{
// forever counting from 0 to 100 until unexpected value appears
oldVal = newVal;
newVal = (oldVal + 1) % 100;
};
}
void thread1()
{
// set unexpected value
g_atomic.store(-1, std::memory_order_release);
}
int main()
{
g_atomic.store(0);
std::thread t0(thread0);
std::thread t1(thread1);
t0.join();
t1.join();
return 0;
}
是否会发生来自线程 1 的写入在线程 0 中可见之前以某种方式在线程 0 的循环中被覆盖? 该程序将永远运行。在我的测试中不会发生这种情况,但是如果有任何保证说情况总是如此,我很感兴趣。
最佳答案
因此,要对此提供明确的答案,不,thread0 永远不会错过来自 thread1 的写入。
这是因为 std::atomic::compare_exchange_strong
是一个原子操作,所以来自 thread0 的写入要么发生在这个操作开始之前(在这种情况下它返回 false
)或者在它完成之后(在这种情况下,调用将在循环的下一次失败)。
如果是任何其他方式,compare_exchange_strong
将没有任何用处,不是吗?
关于c++ - 使用 std::atomic::compare_exchange_strong 时,对 std::atomic 的写入是否会被其他线程看不到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54480931/