array< atomic_size_t, 10 > A;
两者似乎都不起作用,返回一个难以理解的错误atomic_init(A,{0})
。A = {ATOMIC_VAR_INIT(0)}
您如何将原子数组初始化为 0?
即使 for 循环在每一步更新数组的一个元素也不起作用。如果我们不能初始化原子数组的目的是什么?
我还想补充一点,我的数组的实际大小很大(不是示例中的 10),所以我需要直接初始化。
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}};
};
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