对于哪个(如果有的话?)STORE_ORDER
& LOAD_ORDER
C++11 是否保证此代码在有限时间内运行?
std::atomic<bool> a{false};
std::thread t{[&]{
while(!a.load(LOAD_ORDER));
}};
a.store(true, STORE_ORDER);
t.join();
我看到两个问题:
内存顺序
在我看来,使用release
& aquire
,编译器和 cpu 可以在 之前重新排序 my join
(假设它的行为像负载)store
,这当然会破坏这一点。
即使使用memory_order_seq_cst
,我也不确定是否禁止此类重新排序,因为我不知道是否join()
真的进行了任何加载或存储。
能见度
如果我正确理解了这个问题memory_order_relaxed
,则不能保证memory_order_relaxed
在有限的时间内其他线程可以看到带有的商店。其他订单是否有这样的保证?
我知道这std::atomic
是关于原子性和内存排序,而不是关于可见性。但我不知道 c++11 中的任何其他工具可以帮助我。我是否需要使用特定于平台的工具来获得正确性保证,如果是,是哪一个?
更进一步——如果我有有限性,那么对速度也有一些承诺会很好。我不认为 C++ 标准做出任何这样的承诺。但是是否有任何编译器或特定于 x86 的方法来保证存储将很快对其他线程可见?
总结:我正在寻找一种方法来快速停止实际上保证具有此属性的工作线程。理想情况下,这将与平台无关。但如果我们不能拥有它,它至少存在于 x86 中吗?