什么时候std :: atomic<>后增量发生?

时间:2014-04-11 17:21:19

标签: c++ multithreading c++11

我很担心原子后增量实际上是如何工作的。例如

std::atomic<int> a = 1; // global
void func(int i) {
    std::cout << i;
}

// execute the following in two threads
func(a++);

我相信a最终变为3,但是有可能看到输出“11”吗?期望两个线程中的一个肯定会看到a成为2?

,这是否安全?

1 个答案:

答案 0 :(得分:3)

您的代码不会按原样编译。 std::atomic<int>不允许复制构建。

首先,让我们看看如果a不是原子的,这是如何工作的:

  1. 制作a
  2. 的副本
  3. 增量a
  4. a的副本传递给func
  5. 在原子情况下(假设您修改func以取int),除了复制/增量以原子方式发生之外,它是相似的。副本仍然传递给func。

    由于增量/副本是原子的,因此调用++的第一个线程会将其从1增加到2,并将1传递给func。第二个将它从2增加到3,并将2传递给func。注意,对func的调用顺序不是确定性的,但应该使用值1调用一次,使用值2调用一次。