我正在开发 Java 库的 C++ 端口。问题之一是我找不到与 Java 的 AtomicLongArray 等效的东西。任何人都知道在 c++ 11 中是否已经有任何等价的东西或者如何实现类似的功能?我看了一下 C++11 atomics 但找不到任何东西。
2 回答
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
向量中。
在 [container.requirements.dataraces] 标准中说
-2- 尽管有(17.6.5.9),当同时
vector<bool>
修改同一序列中不同元素中包含的对象的内容时,需要实现来避免数据竞争,除了 。-3- [注意:对于
vector<int> x
大小大于1的a,x[1] = 5
可以*x.begin() = 10
并发执行而不会发生数据竞争,但x[0] = 5
并发*x.begin() = 10
执行可能会导致数据竞争。作为一般规则的一个例外,对于 avector<bool> y, y[0] = true
may 与y[1] = true
. ——尾注]
所以任何容器(除了 evil vector<bool>
)都允许在没有数据竞争的情况下更新单独的元素。为了确保对单个元素的更新是安全的,请使用原子类型的容器,例如std::vector<std::atomic<long>>