【发布时间】:2020-06-10 03:23:23
【问题描述】:
我希望下面的程序不会挂起。
如果在(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;
}
所以问题是这里会发生什么:
- 程序可能会挂起,我必须使用栅栏来防止它。究竟是什么围栏,在哪里以及为什么?
- 程序可能不会挂起。那么如何防止提到的重新排序?我问的不是实施,而是标准措辞。
【问题讨论】:
-
整个功能感觉就像是灾难的秘诀,尤其是考虑到 ABA 漏洞。 :-)
-
我想打电话给
WaitOnAddress,我想称之为跨平台方式。我有通常的基于环形缓冲区的 SPSC 队列,所以我不害怕 ABA。所以我喜欢这个功能。 -
“常见的 Windows 事件对象咆哮” :-)
-
在 C++20 中遇到 Windows 自动重置事件:std::binary_semaphore
-
但是,原子等待更... 强大
标签: c++ language-lawyer c++20 memory-barriers stdatomic