请考虑以下代码:
std::atomic<bool> flag(false);
//Thread 1
flag.store(true,std::memory_order_relaxed);
//Thread 2
while(!flag.load(std::memory_order_relaxed)) ; // stay in the loop
std::cout << "loaded";
有没有保证最后一行被执行?如果答案是否定的,应该如何解决(尽可能减少开销)?
是,保证最后一行将最终执行[intro.progress]/18
实现应确保原子或同步操作分配的最后一个值(按修改顺序)将在有限的时间内对所有其他线程可见。
因为您的标志是原子的,并且也是任何线程以任何方式访问的唯一内容,所以这里没有数据争用。由于除了原子之外没有其他对象的加载或存储,因此程序无法依赖于这些不存在的加载或存储相对于原子的加载或存储的任何特定顺序。因此,轻松的存储顺序就足够了。由于可以保证线程1中的原子存储最终将对线程2可见,因此可以保证循环最终终止...