我们如何强制变量共享?
How do we force variable sharing?
考虑以下代码:
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
An implementation should ensure that the last value (in modification order) assigned by an atomic or synchronization operation will become visible to all other threads in a finite period of time.
由于您的标志是原子的,并且也是任何线程以任何方式访问的唯一东西,因此这里没有数据竞争。由于除了您的原子之外没有其他对象的加载或存储,因此您的程序不可能依赖于此类不存在的加载或存储相对于您的原子的加载和存储的任何特定顺序。因此,宽松的记忆顺序就足够了。由于保证线程 1 中的原子存储最终对线程 2 可见,因此保证循环最终终止...
考虑以下代码:
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
An implementation should ensure that the last value (in modification order) assigned by an atomic or synchronization operation will become visible to all other threads in a finite period of time.
由于您的标志是原子的,并且也是任何线程以任何方式访问的唯一东西,因此这里没有数据竞争。由于除了您的原子之外没有其他对象的加载或存储,因此您的程序不可能依赖于此类不存在的加载或存储相对于您的原子的加载和存储的任何特定顺序。因此,宽松的记忆顺序就足够了。由于保证线程 1 中的原子存储最终对线程 2 可见,因此保证循环最终终止...