带自定义类的std :: atomic(C++ 11)

yva*_*den 17 c++ xcode atomic 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;
}
Run Code Online (Sandbox Code Playgroud)

当然这个例子没有多大意义,但它是我能想到的最短的.它确实在VS2012中运行,但不在xcode中运行(给我上面显示的链接器错误).

发生什么了?我在这里滥用std :: atomic吗?我正在处理的库是多线程的,用于音频处理.因此,如果我没有以正确的方式使用std :: atomic,那么它并没有真正显示,因为性能非常好,而且我没有任何线程问题.或者xcode可能缺少什么?

更新:

我检查了andrey的答案,因为它有最多的信息,尽管所有3个答案都很有用.我显然不是这方面的专家,但似乎VS2012超出了C++ 11中应该实现的范围.

那么如何离开这里?我看到了一些选择.

  1. 不要在这个类中使用atomic.在我的特殊情况下,这将非常困难,因为我的vector类在整个代码中使用.锁定和解锁互斥锁可能会减慢很多事情.
  2. 自己实现原子的功能.这看起来很复杂.我将它保存为最后一个选项.
  3. 看看是否可以使用boost :: atomic完成某些事情.这似乎乍一看似乎有效.我必须对它做更多的测试.

And*_*olk 7

如http://en.cppreference.com/w/cpp/atomic/atomic中所述:

标准库为以下类型提供std :: atomic模板的完全特化:

1)bool类型及其typedef的一个特化
2)整数类型的特化和typedef
3)所有指针类型的std :: atomic

怎么样的Boost.Atomic.如Boost.Atomic限制中所述:

使用非POD类作为模板参数进行原子操作会导致未定义的行为.

  • `std :: atomic`只要求类型可以轻易复制,并且OP中显示的类是可以轻易复制的. (5认同)
  • 请注意,"提供完全特化"并不意味着不支持其他类型,只是它们不是通过特化实现的.通用模板`std :: atomic`处理普通的可复制类型.数字类型的特化提供了不适用于任意用户定义类型的其他成员函数(例如算术运算). (3认同)