2017-06-14 118 views
0

考慮這個簡單的代碼:解析的外部符號 「的std :: atomic_fetch_add」

#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:解析外部符號「雙__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>,那麼發生了什麼?

+0

誰告訴你'std :: atomic'專門用於'double'? – Slava

+0

這是,但[沒有重載需要雙](http://en.cppreference.com/w/cpp/atomic/atomic_fetch_add) – Borgleader

+0

@Slava我沒有看到任何我不能用它的地方'double'! – Jaber

回答

1

正如documentation說:

標準庫提供的std ::原子模板的特殊化以下類型:

double不在列表中。還有非會員功能註釋:

對於std :: atomic的所有成員 函數都有非成員函數模板等價物。那些非成員函數可能爲 ,對於不是 std :: atomic的特化類型,但能夠保證原子性的類型,也會被重載。 標準庫中唯一的此類型 是std :: shared_ptr

所以double不支持。

+0

你知道任何爲非整型類型實現原子算術的庫嗎? – Jaber

+1

@Jaber,從來不需要這樣的野獸,我使用互斥 - 過早優化是萬惡之源。 – Slava

+2

來澄清你的答案:'double'支持基本的原子操作,如('load','store'等);但不支持專門的操作(如算術'+','-',...),如[這裏]所述(https://stackoverflow.com/questions/30048533/why-isnt-atomic-double-fully -implemented/30050429#30050429)。 – Jaber