如何将 std::atomics 数组初始化为零?

问题描述 投票:0回答:3
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),所以我需要直接初始化。

c++ arrays c++11 atomic stdatomic
3个回答
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>>
构造
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}}; };
    

3
投票
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

)。

前段时间发布了类似的问题:

线程安全无锁数组


0
投票
“巨大”数字:

#include <array> #include <atomic> #include <algorithm> int main() { std::array<std::atomic_size_t, 1000> a; std::ranges::fill(a, 0); }
    
© www.soinside.com 2019 - 2024. All rights reserved.