gpt4 book ai didi

c++ - 使用 std::atomic::compare_exchange_strong 时,对 std::atomic 的写入是否会被其他线程看不到?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:27 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com