我正在开发一个Java库的C++端口。其中一个问题是我找不到与Java的AtomicLongArray相当的东西。有谁知道c++ 11中是否已经有了类似的功能,或者如何实现类似的功能?我看了看C++11原子,但什么也没找到。
发布于 2012-06-14 00:54:37
AtomicLongArray的文档中写道:
一个长数组,其中的元素可以自动更新。有关原子变量属性的说明,请参阅
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。
发布于 2012-06-14 02:15:14
在container.requirements.dataraces中,标准说
-2-尽管如此(17.6.5.9),当同时修改同一序列中不同元素中包含的对象的内容(
vector<bool>除外)时,需要实现以避免数据竞争。
-3- [注意:对于大于1的vector<int> x,可以同时执行x[1] = 5和*x.begin() = 10而不会有数据竞争,但同时执行x[0] = 5和*x.begin() = 10可能会导致数据竞争。作为一般规则的例外,因为vector<bool> y, y[0] = true可以与y[1] = true竞争。-end备注]
因此,任何容器(除了邪恶的vector<bool>)都允许在没有数据竞争的情况下更新单独的元素。为了确保对单个元素的更新是安全的,请使用原子类型的容器,例如std::vector<std::atomic<long>>
https://stackoverflow.com/questions/11019615
复制相似问题