2013-04-08 68 views
16

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

用于建筑x86_64的未定义符号: “__atomic_store”,从引用:在主 _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可能缺乏什么?

更新:

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

那么该怎么走?我看到几个选项。

  1. 不要对此类使用原子。在我的具体情况下,这将是非常困难的,因为我的矢量类被用在整个代码中。锁定和解锁互斥锁可能会使事情减慢很多。
  2. 自己实现原子的功能。这对我来说看起来很复杂。我将它保存为最后一个选项。
  3. 看看boost :: atomic可以做些什么。这似乎乍一看起来很有效。尽管如此,我仍然需要做更多的测试。
+1

它可能根本不支持。 – GManNickG 2013-04-08 22:47:25

回答

7

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

The standard library provides full specializations of the std::atomic template for the following types:

1) One specialization for the type bool and its typedef
2) Specializations and typedefs for integral types
3) std::atomic for all pointer types

怎么样的Boost.Atomic。如Boost.Atomic limitations中所述:

Using non-POD-classes as template parameter to atomic results in undefined behavior.

+5

'std :: atomic'只要求类型可以复制,并且OP中显示的类是可复制的。 – bames53 2013-04-08 19:28:58

+3

请注意,“提供完整的专业化”并不意味着其他类型不受支持,只是它们没有通过专业化实现。通用模板'std :: atomic'处理可复制的类型。数字类型的特化提供了不适用于任意用户定义类型的其他成员函数(如算术运算)。 – 2013-04-08 20:04:55

+0

但是,这不应该意味着如果构造函数被遗漏了,示例应该链接吗?如果我将它评论出来,我仍然会遇到同样的错误。 – yvanvds 2013-04-08 20:37:18

0

检查标准库要在铛编译器设置使用项目页面其中。 它应该是GNU的libstdC++,支持C++ 11或libC++。

希望它会有所帮助。

+0

谢谢。检查这些设置是很好的。虽然在这种情况下,这不是问题,主要是因为这些设置似乎是在xcode 4.6中的标准 – yvanvds 2013-04-08 20:51:08

+0

我检查了我的Mac上的程序,并得到了同样的错误...现在没有想法。看起来像标准库中的缺陷或不支持的功能 – inkooboo 2013-04-09 07:05:09