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.
- 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.
- Implementieren Sie die Funktionen selbst für atomare. Das sieht für mich sehr kompliziert aus. Ich werde es als letzte Option speichern.
- Sehen Sie, ob etwas mit boost :: atomic getan werden kann. Dies scheint auf den ersten Blick zu funktionieren. Ich muss allerdings mehr Tests machen.
Es kann einfach noch nicht unterstützt werden. – GManNickG