2017-06-14 5 views
0

diesen einfachen Code Bedenken Sie:nicht aufgelöstes externes Symbol "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(); 
} 

Kompilieren es bewirkt:

Fehler LNK2019: nicht aufgelöstes externes Symbol „double __cdecl std :: atomic_fetch_add (struct std :: atomic *, double) "(?? $ atomic_fetch_add @ N @ std @@ YANPAU? $ atomar @ N @ 0 @ N @ Z) referenziert in der Funktion" void __cdecl add (Struktur std :: atomic &, double) "(? addiere @@ YAXAAU? $ atomar @ N @ std @@ N @ Z)

Nach this, atomic_fetch_add ist in <atomic> definiert, was passiert also?

+0

Wer hat dir gesagt, dass 'std :: atomic' auf' double' spezialisiert ist? – Slava

+0

Es ist, aber [keine der Überladungen nehmen ein Double] (http://en.cppreference.com/w/cpp/atomic/atomic_fetch_add) – Borgleader

+0

@Slava Ich habe nirgendwo gesehen, dass ich es nicht verwenden kann 'doppelt'! – Jaber

Antwort

1

Wie in documentation erklärt:

und double ist nicht in der Liste:

Die Standardbibliothek für die folgenden Arten Spezialisierungen der std :: Atom Vorlage bietet. Es ist zu beachten Sie auch für Nicht-Mitglieder-Funktionen:

Es gibt nicht-Member-Funktion Template-Äquivalente für alle Mitglieds Funktionen std :: Atom. Diese Nichtmitgliedsfunktionen können zusätzlich für Typen überladen sein, die keine Spezialisierungen von std :: atomic sind, aber Atomizität garantieren können. Der einzige Typ in der Standardbibliothek ist std :: shared_ptr.

So wird double nicht unterstützt.

+0

Kennen Sie irgendeine Bibliothek, die atomare Arithmetik für nicht ganzzahlige Typen implementiert? – Jaber

+1

@Jaber, ich brauche nie so ein Biest, ich benutze Mutex - vorzeitige Optimierung ist die Wurzel allen Übels. – Slava

+2

um Ihre Antwort zu klären: 'double' wird für grundlegende atomare Operationen wie (' load', 'store', etc) unterstützt; aber wird nicht für spezielle Operationen (wie arithmetische '+', '-', ...) wie hier [hier] (https://stackoverflow.com/questions/30048533/why-isnt-atomic-double-fully) unterstützt -implementiert/30050429 # 30050429). – Jaber

Verwandte Themen