2013-04-08 16 views
16

Ich verwende std :: atomic mit einer benutzerdefinierten Klasse in meiner Bibliothek. Alles funktioniert gut mit MSVC, aber jetzt, dass ich es auf macOS zu laufen zu bekommen bin versucht, erhalte ich ein Linker-Fehler:std :: atomic mit benutzerdefinierten Klasse (C++ 11)

undefinierte Symbole für Architektur x86_64: „__atomic_store“, verweisen von: _main in main. o

ich habe einige Test-Code erstellt diesen

#include <iostream> 
#include <atomic> 

using namespace std; 

class Vec { 
    public: 
    int x, y, z; 
    Vec() { x = y = z = 0; } 
}; 

std::atomic<Vec> x; 


int main() 
{ 
    Vec a; 
    x = a; 
    cin.get(); 
    return 0; 
} 

natürlich zu replizieren dieses Beispiel nicht viel Sinn macht, aber es ist die kürzeste ich einfiel. Es läuft in VS2012, aber nicht in xcode (gibt mir den oben gezeigten Linker-Fehler).

Also, was ist los? Missbrauche ich std :: atomic hier? Die Bibliothek, an der ich arbeite, ist stark multithread und wird für die Audioverarbeitung verwendet. Wenn ich also std :: atomic nicht korrekt verwende, wird es nicht wirklich angezeigt, weil die Leistung sehr gut ist und ich keine Threading-Probleme damit habe. Oder fehlt xcode vielleicht etwas?

Update:

ich Andreys Antwort überprüft haben, weil sie die meisten Informationen hat, obwohl alle drei Antworten nützlich sind. Ich bin kein Experte in diesem (offensichtlich) aber es scheint, dass VS2012 geht über das hinaus, was in C++ 11 implementiert werden sollte.

Also, wie von hier zu gehen? Ich sehe ein paar Optionen.

  1. Verwenden Sie keine atomaren für diese Klasse. In meinem speziellen Fall wäre dies sehr schwierig, da meine Vektorklasse über den gesamten Code hinweg verwendet wird. Das Sperren und Freigeben von Mutexen würde wahrscheinlich die Dinge verlangsamen.
  2. Implementieren Sie die Funktionen selbst für atomare. Das sieht für mich sehr kompliziert aus. Ich werde es als letzte Option speichern.
  3. Sehen Sie, ob etwas mit boost :: atomic getan werden kann. Dies scheint auf den ersten Blick zu funktionieren. Ich muss allerdings mehr Tests machen.
+1

Es kann einfach noch nicht unterstützt werden. – GManNickG

Antwort

7

Wie in http://en.cppreference.com/w/cpp/atomic/atomic beschrieben:

The standard library provides full specializations of the std::atomic template for the following types:

1) One specialization for the type bool and its typedef
2) Specializations and typedefs for integral types
3) std::atomic for all pointer types

Was ist mit dem Boost.Atomic. Wie in beschrieben:

Using non-POD-classes as template parameter to atomic results in undefined behavior.

+5

'std :: atomic' erfordert nur den Typ, um trivial kopierbar zu sein, und die im OP angezeigte Klasse ist trivial kopierbar. – bames53

+3

Beachten Sie, dass "vollständige Spezialisierungen" nicht bedeutet, dass andere Typen nicht unterstützt werden, sondern nur, dass sie nicht durch Spezialisierungen implementiert werden. Das allgemeine Template 'std :: atomic' behandelt trivial kopierbare Typen. Die Spezialisierungen für numerische Typen bieten zusätzliche Elementfunktionen (z. B. arithmetische Operationen), die nicht für beliebige benutzerdefinierte Typen gelten. –

+0

Aber sollte das nicht bedeuten, dass das Beispiel verlinken sollte, wenn der Konstruktor weggelassen wurde? Ich bekomme immer noch den gleichen Fehler, wenn ich es auskommentiere. – yvanvds

0

prüfen, die Standard-Bibliothek Sie in Klirren Compiler-Einstellungen in Projektseite verwenden. Es sollte GNUs libstdC++ mit C++ 11 Unterstützung oder libC++ sein.

Ich hoffe, es wird helfen.

+0

Danke. Es ist gut, diese Einstellungen zu überprüfen. Obwohl dies in diesem Fall nicht das Problem ist, hauptsächlich weil diese Einstellungen in xcode 4.6 – yvanvds

+0

Standard zu sein scheinen, habe ich Ihr Programm auf meinem Mac überprüft und habe den gleichen Fehler ... Habe jetzt keine Ideen. Sieht aus wie ein Fehler in der Standardbibliothek oder nicht unterstützte Funktion – inkooboo

Verwandte Themen