【问题标题】:C++ - How to initialise an array of atomics?C++ - 如何初始化一个原子数组?
【发布时间】:2013-10-17 18:50:26
【问题描述】:
array< atomic_size_t, 10 > A;

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

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

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

【问题讨论】:

    标签: c++ arrays c++11 atomic


    【解决方案1】:
    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(&amp;x,std::size_t(0)) 替换为x=std::size_t(0)

    注意std::atomic&lt;&gt; 不可复制,这会破坏一些容器方法(包括从T 构造std::array&lt;std::atomic&lt;T&gt;&gt;)。此外,将原子存储在数组中可能会导致错误共享,从而影响性能。

    编辑 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}};
    };
    

    【讨论】:

    • 不幸的是,atomic_init 在 C++20 中已被弃用 :( 请参阅 wg21.link/p0883
    【解决方案2】:
    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)。

    不久前发布了一个类似的问题:Thread-safe lock-free array

    【讨论】:

    • 好的,但我以 10 为例。实际上,我应该用大量的零来初始化我的数组。
    • 那不可能有原子变量的集合?! o.O
    • 有点。你必须跳过几个小圈。另一个 SO 问题有一个如何做的例子。
    • 事实上,我在发布我的问题之前就注意到了你链接的问题,但我天真地认为他们想做更高级的事情。因为我“只是”想初始化一个静态原子数组,所以我认为会有一种更简单的方法。也因为在互联网的某个地方,人们像我一样定义了原子数组;现在我无法想象他们是如何使用它们的。
    • 对不起,不得不投反对票,答案是错误的。请参阅下面的答案
    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    相关资源
    最近更新 更多