C++ 未解析的外部符号“std::atomic_fetch_add”
考虑以下简单代码:C++ 未解析的外部符号“std::atomic_fetch_add”,c++,atomic,C++,Atomic,考虑以下简单代码: #include <iostream> #include <atomic> void add(std::atomic<double> & a, double c) { std::atomic_fetch_add(&a, c); } int main() { std::atomic<double> a; a.store(0); std::cout << a.load
#include <iostream>
#include <atomic>
void add(std::atomic<double> & a, double c)
{
std::atomic_fetch_add(&a, c);
}
int main()
{
std::atomic<double> a;
a.store(0);
std::cout << a.load() << std::endl;
add(a, 5.0);
std::cout << a.load() << std::endl;
std::cin.get();
}
编译它将导致:
错误LNK2019:未解析的外部符号双\uu cdecl std::atomic\u fetch\u addstruct std::atomic*,双???$atomic\u fetch_add@N@性病@@YANPAU$atomic@N@0@N@函数void\uu cdecl addstruct std::atomic&,double?add@@YAXAAU中引用了Z$atomic@N@性病@@N@Z
根据,中定义了原子提取添加,因此发生了什么情况?如中所述:
标准库为以下类型提供std::atomic模板的专门化:
而double不在列表中。对于非成员函数,还需要注意:
所有成员都有非成员函数模板等价物
std::atomic的函数。这些非成员职能可以是:
另外,对于不是的专门化的类型重载
原子的,但能够保证原子性。唯一这样的类型
标准库中有std::shared\u ptr
所以不支持double。谁告诉过你std::atomic专门用于double?是的,但是@Slava我没有看到任何地方不能用于double@Jaber-明确列出的std::atomic完全或部分专用的类型,double不在列表中。你知道有哪个库为非整数类型实现了原子算法吗?@Jaber,no从来都不需要这样的beast,我使用互斥锁——过早优化是万恶之源。为了澄清你的答案:基本的原子操作(如加载、存储等)支持double;但不支持算术+,-。。。如前所述。