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

后端 未结 2 1028
伪装坚强ぢ
伪装坚强ぢ 2021-01-18 03:07
array< atomic_size_t, 10 > A;

Neither atomic_init(A,{0}) nor A = {ATOMIC_VAR_INIT(0)} seem to work, returning an un

2条回答
  •  暖寄归人
    2021-01-18 03:25

    std::array, 100> A;
    for(auto&x:A)
      std::atomic_init(&x,std::size_t(0));
    

    does the job using

    clang++ -std=c++11 -stdlib=libc++ -Weverything -Wno-c++98-compat
    

    using clang-3.3. I also tried with gcc 4.8, but it doesn't support std::atomic_init(). However, I suppose you can replace std::atomic_init(&x,std::size_t(0)) with x=std::size_t(0).

    Note that std::atomic<> is not copyable, which breaks some container methods (including construction of std::array> from a T). Also, storing atomics in an array may cause false sharing, affecting performance.

    EDIT 2019

    The code in the accepted answer by Zac Howland does not compile (neither with clang nor with gcc). Here is a version that will

    struct foo
    {
        std::array arr= {{{0},{0}}};
        std::atomic_size_t arr_alt[2] = {{0},{0}};
    };
    

提交回复
热议问题