未解析的外部符号“std::atomic_fetch_add”
Posted
技术标签:
【中文标题】未解析的外部符号“std::atomic_fetch_add”【英文标题】:unresolved external symbol "std::atomic_fetch_add" 【发布时间】:2017-06-14 13:41:32 【问题描述】:考虑这个简单的代码:
#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: 无法解析的外部符号 "double __cdecl std::atomic_fetch_add(struct std::atomic *,double)" (??$atomic_fetch_add@N@std@@YANPAU?$atomic@N@0@N@Z ) 在函数“void __cdecl add(struct std::atomic &,double)”中引用 (?add@@YAXAAU?$atomic@N@std@@N@Z)
根据this,atomic_fetch_add
是在<atomic>
中定义的,那么这是怎么回事?
【问题讨论】:
谁告诉你std::atomic
专门用于double
?
是的,但是none of the overloads take a double
@Slava 我没有看到任何我无法将其用于double
的地方!
@Jaber en.cppreference.com/w/cpp/atomic/atomic - 明确列出的类型,std::atomic
完全或部分专用,double
不在列表中。
【参考方案1】:
如documentation中所述:
标准库为以下类型提供了 std::atomic 模板的特化:
并且double
不在列表中。非成员函数也有注意事项:
所有成员都有非成员函数模板等价物 std::atomic 的函数。那些非成员函数可能是 对非特化的类型额外重载 std::atomic,但能够保证原子性。 唯一的这种类型 在标准库中是 std::shared_ptr。
所以不支持double
。
【讨论】:
你知道任何为非整数类型实现原子算术的库吗? @Jaber,从来不需要这样的野兽,我使用互斥锁 - 过早优化是万恶之源。 澄清您的答案:double
支持基本原子操作,例如(load
、store
等);但不支持专用操作(如算术+
、-
、...),如here 所述。以上是关于未解析的外部符号“std::atomic_fetch_add”的主要内容,如果未能解决你的问题,请参考以下文章