C++ - 如何初始化原子组学数组
C++ - How to initialise an array of atomics?
array< atomic_size_t, 10 > A;
atomic_init(A,{0})
和A = {ATOMIC_VAR_INIT(0)}
似乎都不起作用,返回了一个难以理解的错误。如何将原子数组初始化为 0?
即使对于循环,在每一步更新数组的一个元素也不起作用。如果我们不能初始化原子数组,它们的目的是什么?
我还想补充一点,我的数组的实际大小很大(不像示例中的 10 个),所以我需要直接初始化。
std::array<std::atomic<std::size_t>, 100> A;
for(auto&x:A)
std::atomic_init(&x,std::size_t(0));
使用
clang++ -std=c++11 -stdlib=libc++ -Weverything -Wno-c++98-compat
使用 clang-3.3。我也尝试过gcc 4.8
,但它不支持std::atomic_init()
。但是,我想你可以用x=std::size_t(0)
替换std::atomic_init(&x,std::size_t(0))
.
请注意,std::atomic<>
不可复制,这会破坏某些容器方法(包括从T
构造std::array<std::atomic<T>>
)。此外,在数组中存储原子可能会导致错误共享,从而影响性能。
编辑 2019
Zac Howland 接受的答案中的代码无法编译(既不使用 clang 也不使用 gcc)。这是一个版本,它将
struct foo
{
std::array<std::atomic_size_t,2> arr= {{{0},{0}}};
std::atomic_size_t arr_alt[2] = {{0},{0}};
};
std::array<atomic_size_t, 10> arr = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
或者如果您可以编译 C++11
std::array<std::atomic_size_t, 10> arr{{{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0} }}; // double braces required
示例:https://www.ideone.com/Mj9kfE
编辑:
我突然想到,您正在尝试将无法复制的原子学存储到要求它们可复制的集合中(注意:我目前无法获得标准的副本。 我知道这适用于其他系列,但我不确定它是否也适用于std::array
)。
不久前发布了类似的问题:线程安全无锁数组
相关文章:
- C++使用整数的压缩数组初始化对象
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 字节数组初始化会导致 DirectX 崩溃
- 使用 new 和 值进行数组初始化,但没有显式数量的元素
- 运行时C++数组初始化问题
- 使用带有参数包的数组的成员数组初始化类
- 仅通过C++中数组初始化的不同方法,即可在同一输入上获得两个不同的答案
- C++ 2 个指针数组初始化 C2440
- C++结构字符数组初始化
- C++中的多维数组初始化
- constexpr数组初始化
- C++引物动态数组初始化程序的数目超过大小
- 使用std::index_sequence对std::数组初始化进行包扩展
- 当 std 数组初始化太小时,C++会引发错误吗?
- 如何确定结构数组初始化的大小?
- Qt并发错误:数组初始化需要大括号括起来的初始值设定项列表
- 此代码中的数组初始化样式是什么?这是标准的吗?
- C++ 使用数组初始化时的 STL 向量内存管理