std::array< std::atomic_size_t, 10 > A;
// ...
std::atomic_init(A, {0}); // error
A = {ATOMIC_VAR_INIT(0)}; // error
如何将
std::atomic
数组初始化为 0
s?
即使 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>>
构造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
示例:编辑:我刚刚想到,您正在尝试将不可复制的原子存储到一个需要它们可复制的集合中(注意:我目前无法访问我的标准副本。我知道这成立对于其他集合来说也是如此,但我不确定它是否也适用于
std::array
)。前段时间发布了类似的问题:
#include <array>
#include <atomic>
#include <algorithm>
int main()
{
std::array<std::atomic_size_t, 1000> a;
std::ranges::fill(a, 0);
}