Pip*_*ppo 6 c++ arrays atomic c++11
array< atomic_size_t, 10 > A;
Run Code Online (Sandbox Code Playgroud)
无论是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));
Run Code Online (Sandbox Code Playgroud)
使用
clang++ -std=c++11 -stdlib=libc++ -Weverything -Wno-c++98-compat
Run Code Online (Sandbox Code Playgroud)
使用 clang-3.3。我也尝试过gcc 4.8,但它不支持std::atomic_init(). 但是,我想您可以替换std::atomic_init(&x,std::size_t(0))为x=std::size_t(0).
请注意,这std::atomic<>是不可复制的,这会破坏一些容器方法(包括std::array<std::atomic<T>>从 a 的构造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}};
};
Run Code Online (Sandbox Code Playgroud)
std::array<atomic_size_t, 10> arr = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Run Code Online (Sandbox Code Playgroud)
或者如果你可以编译 C++11
std::array<std::atomic_size_t, 10> arr{{{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0} }}; // double braces required
Run Code Online (Sandbox Code Playgroud)
示例: https: //www.ideone.com/Mj9kfE
编辑:
我只是想到您正在尝试将不可复制的原子存储到一个需要它们可复制的集合中(注意:我目前无法访问我的标准副本。我知道这是正确的对于其他集合,但我不确定它std::array是否也适用)。
前段时间发布了类似的问题: Thread-safe lock-free array
| 归档时间: |
|
| 查看次数: |
7147 次 |
| 最近记录: |