我很担心原子后增量实际上是如何工作的。例如
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?
答案 0 :(得分:3)
您的代码不会按原样编译。 std::atomic<int>
不允许复制构建。
首先,让我们看看如果a
不是原子的,这是如何工作的:
a
a
a
的副本传递给func 在原子情况下(假设您修改func以取int
),除了复制/增量以原子方式发生之外,它是相似的。副本仍然传递给func。
由于增量/副本是原子的,因此调用++
的第一个线程会将其从1增加到2,并将1传递给func。第二个将它从2增加到3,并将2传递给func。注意,对func的调用顺序不是确定性的,但应该使用值1调用一次,使用值2调用一次。