std :: atomic mit benutzerdefinierter Klasse (C ++ 11)

Ich verwende std :: atomic mit einer benutzerdefinierten Klasse in meiner Bibliothek. Alles funktioniert gut mit MSVC, aber jetzt, wo ich versuche, es auf macOS laufen zu lassen, bekomme ich einen Linker-Fehler:

undefinierte Symbole für die Architektur x86_64: "__atomic_store", referenziert von: _main in main.o

Ich habe einen Testcode erstellt, um dies zu replizieren

#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 macht dieses Beispiel nicht viel Sinn, aber es ist das kürzeste, das ich mir vorstellen kann. Es läuft in VS2012, aber nicht in xcode (was mir den oben gezeigten Linkerfehler gibt).

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

Aktualisieren:

Ich habe die Antwort von andrey überprüft, da sie die meisten Informationen enthält, obwohl alle drei Antworten nützlich sind. Ich bin (offensichtlich) kein Experte in diesem Bereich, aber es scheint, dass VS2012 über das hinausgeht, was in C ++ 11 implementiert werden sollte.

Also, wie geht es weiter? Ich sehe ein paar Möglichkeiten.

Verwenden Sie für diese Klasse kein Atomic. In meinem speziellen Fall wäre dies sehr schwierig, da meine Vektorklasse im gesamten Code verwendet wird. Das Sperren und Entsperren von Mutexen würde die Dinge wahrscheinlich sehr verlangsamen.Implementiere die Funktionen selbst für atomic. Das sieht für mich sehr kompliziert aus. Ich werde es als letzte Option speichern.Sehen Sie, ob mit boost :: atomic etwas getan werden kann. Das scheint auf den ersten Blick zu funktionieren. Ich muss noch mehr Tests machen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage