array< atomic_size_t, 10 > A;
atomic_init(A,{0})
和A = {ATOMIC_VAR_INIT(0)}
均无效,返回了无法理解的错误。您如何将原子数组初始化为0s?
即使对于循环,在每一步都更新数组的一个元素也不起作用。如果我们不能初始化原子数组的目的是什么?
我还想补充一点,数组的实际大小非常大(在示例中不是10,所以我需要直接初始化。
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
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
的方法)。另外,将原子存储在数组中可能会导致假共享,从而影响性能。
EDIT 2019
accepted answer by 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}};
};