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

时间:2013-04-08 18:28:54

标签: c++ xcode c++11 atomic

我在我的库中使用std :: atomic和自定义类。一切都适用于MSVC,但现在我试图让它在macOS上运行,我得到一个链接器错误:

架构x86_64的未定义符号: “__atomic_store”,引自: _main in main.o

我已经创建了一些测试代码来复制这个

#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中应该实现的范围。

那么怎么走?我看到了一些选择。

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

2 个答案:

答案 0 :(得分:7)

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

  

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

     

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

Boost.Atomic 怎么样?如Boost.Atomic limitations

中所述
  

使用非POD类作为原子结果的模板参数   未定义的行为。

答案 1 :(得分:0)

clang编译器设置中的项目页面中查看您正在使用的标准库。 它应该是GNU的libstdc ++,带有c ++ 11支持或libc ++。

希望它会有所帮助。