了解C++中放松的内存顺序

Aim*_*ang 6 c++ concurrency atomic memory-barriers

std::atomic<int> unique_ids;

void foo() {    
  int i = unique_ids.fetch_add(1, std::memory_order_relaxed);
  std::cout<<i;
}

int main(int argc, char* argv[]) {
  std::vector<std::thread> threads;
  for (int i = 0; i < 9; ++i) {
       threads.emplace_back(foo);
  }

  for (int i = 0; i < 9; ++i) {
      threads[i].join();
  }
  std::cout << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的目标是使用atomic为并发程序生成唯一的id,但我不关心命令.

对于上面的代码,我的理解是foo中的输出值应该是不同的,尽管它们的顺序不能保证.

我测试了上面的代码一百次,所有结果都是我的预期.我是原子/记忆秩序的初学者,任何人都可以帮助我澄清我的理解吗?

提前致谢.爱民

PS我想指出这个问题与c ++,std :: atomic,什么是std :: memory_order以及如何使用它们不同,因为我的问题是关于memory_order_relaxed的理解而不是一般问题关于原子和记忆顺序的解释.

Dav*_*rtz 2

这是宽松内存排序的合法使用。您只需要该操作相对于对同一原子的其他访问而言是原子的。无论内存顺序如何,每个原子操作都具有该特征,否则它根本就不是原子的。