我对C ++原子变量感到困惑。如果我有一个想在一个线程中递增并在另一个线程中读取的原子x,我可以做++ x还是必须做x.atomic_fetch_add(1)。在阅读器线程中,我可以做类似cout << x;的事情吗?还是我必须做cout << x.load()。
如果我有
int x;
atomic<bool> y;
然后在线程一中
if (!y)
{
x = 23;
y = true;
}
和第二个线程
if (y)
{
cout << x;
y = false;
}
是否可以确保线程2将(非原子)x的值视为23。如果没有,如果我更改对y的访问以使用加载和存储,那会有所不同吗?是否保证第二个线程将看到在第一个线程将y设置为true之前所有非原子操作的结果?
谁能建议一本书清楚地解释这些细节。
答案 0 :(得分:1)
总的来说,您有两个问题要问变量y:
这与操作的原子性有关,即一次完成所有操作。原子性为您提供此保证
有关即使线程运行相同的代码位,由于在没有特定顺序约束的情况下其他线程中的操作,它们也可能在事件顺序上存在分歧,因为不同的CPU缓存和内部缓冲区可以为同一内存保留不同的值
如注释中所述,您所做的操作具有足够的内存顺序以保证您需要的内容。
例如,假设序列顺序一致性为memory_order_seq_cst,请参见链接link here
希望有帮助