25

我在我的库中使用 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 可能缺少什么?

更新:

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

那么如何从这里出发呢?我看到几个选项。

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

2 回答 2

9

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

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

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

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

使用非 POD 类作为 atomic 的模板参数会导致未定义的行为。

于 2013-04-08T19:18:09.677 回答
0

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

希望它会有所帮助。

于 2013-04-08T19:13:38.963 回答