8
array< atomic_size_t, 10 > A;

どちらatomic_init(A,{0})A = {ATOMIC_VAR_INIT(0)}機能していないようで、理解できないエラーが返されます。アトミック配列を 0 に初期化するにはどうすればよいでしょうか?

ステップごとに配列の 1 つの要素を更新する for ループでさえ、機能しません。初期化できない場合、アトミック配列の目的は何ですか?

また、配列の実際のサイズが非常に大きい (例のように 10 ではない) ことも付け加えておきたいので、直接初期化する必要があります。

4

2 に答える 2

5
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>>from a の構築を含む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}};
};
于 2013-10-17T19:21:11.977 に答える
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

于 2013-10-17T19:06:28.450 に答える