的std ::原子与自定义类(C ++ 11)(std::atomic with custom cl

2019-08-20 09:29发布

我使用的std ::原子在我的库中的自定义类。 所有的正常工作与MSVC,但现在,我试图让它在MacOS运行,我得到一个链接错误:

对于建筑x86_64的未定义的符号:“__atomic_store”,从引用:_main在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 ::原子在这里? 我工作的图书馆是严重的多线程和用于音频处理。 所以,如果我不使用的std ::原子以正确的方式,它是不是真的有显示,因为性能非常好,我没有任何与它的线程问题。 或者Xcode的也许缺了点什么?

更新:

我检查了安德烈的答案,因为它拥有最多的信息,尽管所有三个答案都是有用的。 我在这个(显然)不是专家,但似乎VS2012已经超出了应在C ++ 11中实现。

因此,如何从这里走? 我看到几个选项。

  1. 不要该类使用原子。 在我的具体情况,因为我的矢量类是用于各地的代码,这将是非常困难。 锁定和解锁互斥可能会慢下来很多。
  2. 实现自己的功能用于原子。 这看起来很复杂我。 我将它保存为最后一个选项。
  3. 看看是否有可以使用的boost ::原子来完成。 这似乎乍一看工作。 我必须这样做就可以了更多的测试,但。

Answer 1:

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

标准库提供了以下类型的std ::原子模板的全专业:

1)BOOL类型和它的typedef一个专业化
2)专业化和类型定义为整数类型
3)的std ::原子的所有指针类型

怎么样Boost.Atomic。 正如在描述Boost.Atomic限制 :

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



Answer 2:

请检查您所使用的标准库在铛编译器设置 项目页面 。 它应该是GNU的的libstdc ++与C ++ 11的支持问题或libc ++。

希望能对大家有所帮助。



文章来源: std::atomic with custom class (C++ 11)