C++ - 如何初始化原子组学数组

C++ - How to initialise an array of atomics?

本文关键字:数组 初始化 C++      更新时间:2023-10-16
array< atomic_size_t, 10 > A;

atomic_init(A,{0})A = {ATOMIC_VAR_INIT(0)}似乎都不起作用,返回了一个难以理解的错误。如何将原子数组初始化为 0?

即使对于循环,在每一步更新数组的一个元素也不起作用。如果我们不能初始化原子数组,它们的目的是什么?

我还想补充一点,我的数组的实际大小很大(不像示例中的 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()。但是,我想你可以用x=std::size_t(0)替换std::atomic_init(&x,std::size_t(0)).

请注意,std::atomic<>不可复制,这会破坏某些容器方法(包括从T构造std::array<std::atomic<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)。

不久前发布了类似的问题:线程安全无锁数组