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