2016-11-18 3 views
1

原子整数の配列、すなわち、それぞれが原子であるn個の整数を作成する必要があります。私はstd::vector<std::atomic<int>>は動作しませんが、私は次のアプローチを試してみて、clangでうまくコンパイルすることがわかりました。C++でダブルポインタを使用してアトミックの動的配列を宣言するのは正しいですか?

これは正しいのですか?また、a[i][0]がすべてここにアトミックになるかどうかを確認する方法はありますか(複数のスレッドでチェックすることを除く)?

+3

'std :: vector >は動作しません。何を試しましたか? 'std :: vector > a(n);'非常にうまくいきます。 –

+0

「a [i] [0] 'がすべて原子であるかどうかを確認することはどういう意味ですか?彼らのタイプは 'std :: atomic 'です。他に何を知っておく必要がありますか? –

+0

私は 'std :: vector >'で 'resize()'を呼び出そうとしていましたが、それが原因でした。しかし、はい、それは完全に動作します、ありがとう。 –

答えて

1

あなたのコードは正しいです(リソースのリークを除いて、私は配列を破壊することは簡潔さのため省略されていると仮定します)。しかし複雑です。まず第一に、 "ダブルポインタ"またはポインタへのポインタを使用する理由は何ですか?なぜこれではない:これはあなたのために働く場合は、

std::vector<std::atomic<int>> a2(n); 

があまりにも動作するはず

std::atomic<int> * a1 = new std::atomic<int>[ n ]; 

、いくつかの違いがありますが、最も重要なのは、おそらくあなたは値によってa1を渡した場合ということです、内容はコピーされませんが、値によってa2を渡すと、内容はコピーされます。

std::atomicはコピーできないため、これは問題がある可能性があります。所有権を移転する必要がある場合を除いて、常にa2を参照渡しする必要があります。その場合はstd::moveとrvalue参照を使用してください。値でa2を渡すことはできません。

関連する問題