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

2019-02-22 05:09发布

问题:

array< atomic_size_t, 10 > A;

Neither atomic_init(A,{0}) nor A = {ATOMIC_VAR_INIT(0)} seem to work, returning an unintelligible error. How would you initialise an array of atomics to 0s?

Even for loops updating one element of the array at every step does not work. What is the purpose of arrays of atomics if we can't initialise them?

I would also like to add that the actual size of my array is huge (not 10 like in the example), so I would need a direct initialisation.

回答1:

std::array<atomic_size_t, 10> arr = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

or if you can compile for C++11

std::array<atomic_size_t, 10> arr{ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; // double braces required

Edit:

It just occurred to me that you are trying to store atomics, which are not copyable, into a collection that would require they be copyable (Note: I can't get to my copy of the standard at the moment. I know this holds true for the other collections, but I'm unsure if it holds true for std::array as well).

A similar problem was posted a while back: Thread-safe lock-free array



回答2:

std::array<std::atomic<std::size_t>, 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<std::atomic<T>> from a T). Also, storing atomics in an array may cause false sharing, affecting performance.