I am using std::atomic with a custom class in my library. All works fine with MSVC, but now that i'm trying to get it to run on macOS, i get a linker error:
undefined symbols for architecture x86_64: "__atomic_store", referenced from: _main in main.o
I've created some test code to replicate this
#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;
}
Of course this example doesn't make much sense, but it's the shortest I could come up with. It does run in VS2012, but not in xcode (giving me the linker error shown above).
So what's going on? Am I abusing std::atomic here? The library I'm working on is heavily multithreaded and used for audio processing. So if I'm not using std::atomic in the correct way, it is not really showing, because performance is very good and I don't have any threading problems with it. Or is xcode perhaps lacking something?
Update:
I've checked andrey's answer because it has the most information, although all 3 answers are useful. I'm no expert in this (obviously) but it seems that VS2012 goes beyond what should be implemented in C++11.
So how to go from here? I see a few options.
As described in http://en.cppreference.com/w/cpp/atomic/atomic:
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
What about the Boost.Atomic. As described in Boost.Atomic limitations:
Using non-POD-classes as template parameter to atomic results in undefined behavior.