std :: atomic :: notify_all的顺序如何?

问题描述 投票:2回答:1

我希望下面的程序不会挂起。

如果在(1)中以相反的顺序观察到(2)和(3),它可能会由于丢失通知而挂起:

#include <atomic>
#include <chrono>
#include <thread>


int main()
{
    std::atomic<bool> go{ false };

    std::thread thd([&go] {
        go.wait(false, std::memory_order_relaxed); // (1)
    });

    std::this_thread::sleep_for(std::chrono::milliseconds(400));

    go.store(true, std::memory_order_relaxed); // (2)
    go.notify_all();                           // (3)

    thd.join();

    return 0;
}

所以问题是这里会发生什么:

  1. 该程序可能会挂起,我必须使用围栏来防止它。究竟是什么栅栏,在哪里以及为什么?
  2. 程序可能不会挂起。那么如何防止重新排序呢?我不是在问实现,而是在问标准措辞。
c++ language-lawyer c++20 memory-barriers stdatomic
1个回答
0
投票

标准状态:

对原子对象M

的原子等待操作的调用通过M
© www.soinside.com 2019 - 2024. All rights reserved.