8
array< atomic_size_t, 10 > A;

两者似乎都不起作用,返回一个难以理解的错误atomic_init(A,{0})A = {ATOMIC_VAR_INIT(0)}您如何将原子数组初始化为 0?

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

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

4

2 回答 2

5
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>>from a 的构造T)。此外,将原子存储在数组中可能会导致错误共享,从而影响性能。

编辑 2019

Zac Howland 接受的答案中的代码无法编译(无论是 clang 还是 gcc)。这是一个版本,将

struct foo
{
    std::array<std::atomic_size_t,2> arr= {{{0},{0}}};
    std::atomic_size_t arr_alt[2] = {{0},{0}};
};
于 2013-10-17T19:21:11.977 回答
2
std::array<atomic_size_t, 10> arr = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

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

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

示例: https ://www.ideone.com/Mj9kfE

编辑:

我突然想到,您正在尝试将不可复制的原子存储到要求它们可复制的集合中(注意:我目前无法获得标准的副本。我知道这是正确的对于其他系列,但我不确定它是否也适用std::array)。

不久前发布了一个类似的问题: Thread-safe lock-free array

于 2013-10-17T19:06:28.450 回答