C ++ - 如何初始化原子数组?

时间:2013-10-17 18:50:26

标签: c++ arrays c++11 atomic

array< atomic_size_t, 10 > A;

atomic_init(A,{0})A = {ATOMIC_VAR_INIT(0)}似乎都无法正常工作,返回无法理解的错误。你如何将一个原子数组初始化为0?

即使是循环,每一步都更新数组的一个元素也不起作用。如果我们不能初始化它们,原子数组的目的是什么?

我还想补充一点,我的数组的实际大小很大(在示例中不是10),所以我需要直接初始化。

2 个答案:

答案 0 :(得分:4)

std::array<std::atomic<std::size_t>, 100> A;
for(auto&x:A)
  std::atomic_init(&x,std::size_t(0));

使用

完成工作
clang++ -std=c++11 -stdlib=libc++ -Weverything -Wno-c++98-compat

使用clang-3.3。我也尝试使用gcc 4.8,但它不支持std::atomic_init()。不过,我想您可以将std::atomic_init(&x,std::size_t(0))替换为x=std::size_t(0)

请注意,std::atomic<>不可复制,这会破坏一些容器方法(包括从std::array<std::atomic<T>>构造T)。此外,将atomics存储在数组中可能会导致 false sharing ,从而影响性能。

答案 1 :(得分:2)

std::array<atomic_size_t, 10> arr = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

或者如果你可以编译C ++ 11

std::array<atomic_size_t, 10> arr{ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; // double braces required

编辑:

我刚想到你试图将不可复制的原子存储到需要它们可复制的集合中(注意:我现在无法访问我的标准副本。我知道这适用于其他集合,但我不确定它是否适用于std::array

一段时间后发布了一个类似的问题:Thread-safe lock-free array