如何使用C ++原子

时间:2018-12-30 21:28:49

标签: c++ c++11 atomic

我对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之前所有非原子操作的结果?

谁能建议一本书清楚地解释这些细节。

1 个答案:

答案 0 :(得分:1)

总的来说,您有两个问题要问变量y:

  • 在线程之间共享变量时,操作是否正确完成?

这与操作的原子性有关,即一次完成所有操作。原子性为您提供此保证

  • 操作完成后,是否要让所有线程看到相同的操作顺序? 在C++ Concurrency in Action
  • 中引用Anthony Williams
  

即使线程运行相同的代码位,由于在没有特定顺序约束的情况下其他线程中的操作,它们也可能在事件顺序上存在分歧,因为不同的CPU缓存和内部缓冲区可以为同一内存保留不同的值

这与memory order

有关

如注释中所述,您所做的操作具有足够的内存顺序以保证您需要的内容。

例如,假设序列顺序一致性为memory_order_seq_cst,请参见链接link here

希望有帮助