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

问题描述 投票:6回答:2
array< atomic_size_t, 10 > A;

atomic_init(A,{0})A = {ATOMIC_VAR_INIT(0)}均无效,返回了无法理解的错误。您如何将原子数组初始化为0s?

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

我还想补充一点,数组的实际大小非常大(在示例中不是10,所以我需要直接初始化。

c++ arrays c++11 atomic
2个回答
1
投票
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


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的方法)。另外,将原子存储在数组中可能会导致假共享,从而影响性能。

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}};
};
© www.soinside.com 2019 - 2024. All rights reserved.