[英]std::atomic with custom class (C++ 11)
我在我的库中使用std :: atomic和自定义类。 一切都适用于MSVC,但现在我试图让它在macOS上运行,我得到一个链接器错误:
体系结构x86_64的未定义符号:“_ _ atomic_store”,引自:main.o中的_main
我已经创建了一些测试代码来复制它
#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;
}
当然这个例子没有多大意义,但它是我能想到的最短的。 它确实在VS2012中运行,但不在xcode中运行(给我上面显示的链接器错误)。
发生什么了? 我在这里滥用std :: atomic吗? 我正在处理的库是多线程的,用于音频处理。 因此,如果我没有以正确的方式使用std :: atomic,那么它并没有真正显示,因为性能非常好,而且我没有任何线程问题。 或者xcode可能缺少什么?
更新:
我检查了andrey的答案,因为它有最多的信息,尽管所有3个答案都很有用。 我显然不是这方面的专家,但似乎VS2012超出了C ++ 11中应该实现的范围。
那么如何离开这里? 我看到了一些选择。
如http://en.cppreference.com/w/cpp/atomic/atomic中所述 :
标准库为以下类型提供std :: atomic模板的完全特化:
1)bool类型及其typedef的一个特化
2)整数类型的特化和类型定义
3)所有指针类型的std :: atomic
怎么样的Boost.Atomic 。 如Boost.Atomic限制中所述 :
使用非POD类作为模板参数进行原子操作会导致未定义的行为。
在clang编译器设置中检查项目页面中使用的标准库。 它应该是GNU的libstdc ++,带有c ++ 11支持或libc ++。
希望它会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.