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

时间:2016-09-25 14:25:56

标签: 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;
}

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

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

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

提前致谢。 爱民

P.S。我想指出这个问题与c++,std::atomic, what is std::memory_order and how to use them不同,因为我的问题是关于对memory_order_relaxed的理解,而不是关于原子和内存顺序的解释的一般性问题。

1 个答案:

答案 0 :(得分:2)

这是放宽内存排序的合法用法。您只需要对相同原子的其他访问进行原子操作。无论内存排序如何,每个原子操作都具有该特性,或者根本不具有原子性。