我打算声明一个原子变量向量,用作多线程程序中的计数器.这是我尝试过的:
#include <atomic>
#include <vector>
int main(void)
{
std::vector<std::atomic<int>> v_a;
std::atomic<int> a_i(1);
v_a.push_back(a_i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是gcc 4.6.3的烦人冗长的错误信息:
In file included from /usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++allocator.h:34:0,
from /usr/include/c++/4.6/bits/allocator.h:48,
from /usr/include/c++/4.6/vector:62,
from test_atomic_vec.h:2,
from test_atomic_vec.cc:1:
/usr/include/c++/4.6/ext/new_allocator.h: In member function ‘void __gnu_cxx::new_allocator<_Tp>::construct(__gnu_cxx::new_allocator<_Tp>::pointer, const _Tp&) [with _Tp = std::atomic<int>, __gnu_cxx::new_allocator<_Tp>::pointer = std::atomic<int>*]’:
/usr/include/c++/4.6/bits/stl_vector.h:830:6: instantiated from ‘void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = std::atomic<int>, _Alloc = std::allocator<std::atomic<int> >, std::vector<_Tp, _Alloc>::value_type = std::atomic<int>]’
test_atomic_vec.cc:10:20: instantiated from here
/usr/include/c++/4.6/ext/new_allocator.h:108:9: error: use of deleted function ‘std::atomic<int>::atomic(const std::atomic<int>&)’
/usr/include/c++/4.6/atomic:538:7: error: declared …Run Code Online (Sandbox Code Playgroud) array< atomic_size_t, 10 > A;
Run Code Online (Sandbox Code Playgroud)
无论是atomic_init(A,{0})也A = {ATOMIC_VAR_INIT(0)}似乎工作,返回一个难以理解的错误.你如何将一个原子数组初始化为0?
即使是循环,在每一步更新数组的一个元素也不起作用.如果我们不能初始化原子数组的目的是什么?
我还想补充一点,我的数组的实际大小是巨大的(在示例中不是10),所以我需要直接初始化.
我正在处理我的原子容器的一些问题并看到了这个链接.
有没有理由说std :: atomic不是可复制构造的?解决方案似乎就是这样,他们只是将T值传递给具有原子加载功能的非原子构造函数(如果我没有弄错的话).
那么一般来说,这个拷贝构造函数线程是否安全?
template<typename T>
struct MobileAtomic
{
std::atomic<T> atomic;
explicit MobileAtomic(std::atomic<T> const& a) : atomic(a.load()) {}
};
Run Code Online (Sandbox Code Playgroud)