Java ライブラリの C++ ポートに取り組んでいます。問題の 1 つは、Java の AtomicLongArray に相当するものが見つからないことです。C ++ 11に既に同等のものがあるかどうか、または同様の機能を実装する方法を知っている人はいますか? C++11 アトミックを調べましたが、何も見つかりませんでした。
2 に答える
AtomicLongArrayのドキュメントには次のように書かれています。
要素をアトミックに更新できる long 配列。
java.util.concurrent.atomic
アトミック変数のプロパティの説明については、パッケージの仕様を参照してください。
それは単純な配列のように思えますstd::atomic<long>
:
std::array<std::atomic<long>, N> array;
// or, if size is not known at compile time
std::vector<std::atomic<long>> vector(n);
要素のみがアトミックであり、コンテナー自体はアトミックではないことに注意してくださいpush_back
。
[container.requirements.dataraces] で、標準は言う
-2- (17.6.5.9) にもかかわらず、実装は、 を除く同じシーケンス内の異なる要素に含まれるオブジェクトのコンテンツが同時に
vector<bool>
変更される場合、データ競合を回避する必要があります。-3- [注:
vector<int> x
サイズが 1 より大きいaの場合、データ競合なしで同時に実行できますが、同時に実行するとデータ競合x[1] = 5
が発生する可能性があります。一般的なルールの例外として、 aが と競合する場合があります。—終わりのメモ]*x.begin() = 10
x[0] = 5
*x.begin() = 10
vector<bool> y, y[0] = true
y[1] = true
したがって、すべてのコンテナー (悪を除くvector<bool>
) では、データ競合なしで個別の要素を更新できます。単一の要素への更新が安全であることも保証するには、アトミック型のコンテナーを使用します。std::vector<std::atomic<long>>