2

我正在开发 Java 库的 C++ 端口。问题之一是我找不到与 Java 的 AtomicLongArray 等效的东西。任何人都知道在 c++ 11 中是否已经有任何等价的东西或者如何实现类似的功能?我看了一下 C++11 atomics 但找不到任何东西。

4

2 回答 2

9

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-13T16:54:37.183 回答
0

在 [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执行可能会导致数据竞争。作为一般规则的一个例外,对于 a vector<bool> y, y[0] = truemay 与y[1] = true. ——尾注]

所以任何容器(除了 evil vector<bool>)都允许在没有数据竞争的情况下更新单独的元素。为了确保对单个元素的更新是安全的,请使用原子类型的容器,例如std::vector<std::atomic<long>>

于 2012-06-13T18:15:14.247 回答