2013-04-08 13 views
16

私のライブラリのカスタムクラスでstd :: atomicを使用しています。すべてはMSVCで正常に動作しますが、今私はそれはMacOSの上で実行するために取得しようとしていることを、私は、リンカエラーを取得:アーキテクチャx86_64版のためstd :: atomic with custom class(C++ 11)

未定義のシンボル: 「__atomic_store」から参照:メインで _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に何か不足しているのでしょうか?

更新:

すべての3つの答えは有用であるが、それは、ほとんどの情報を持っているので、私はアンドレイの答えをチェックしました。私はこれについて専門家はいませんが(明らかに)、VS2012はC++ 11で実装されるべきものを超えているようです。

ここからどうやって行くのですか?いくつかのオプションがあります。

  1. このクラスの原子を使用しないでください。私のベクトルクラスはコード全体に使用されているので、これは非常に難しいでしょう。ミューテックスをロックしたりアンロックしたりすると、おそらく遅くなるでしょう。
  2. アトミックに関数を実装します。それは私には非常に複雑に見えます。私は最後のオプションとして保存します。
  3. boost :: atomicで何かできるかどうか確認してください。一見するとこれはうまくいくようです。私はそれについてより多くのテストをしなければならない。あなたは打ち鳴らすのコンパイラ設定プロジェクトページで使用している標準ライブラリ
+1

単純にサポートされていない可能性があります。 – GManNickG

答えて

7

http://en.cppreference.com/w/cpp/atomic/atomicで説明したように:Boost.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 limitationsに記載されているとおり:

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

+5

'std :: atomic'は、型を簡単にコピー可能であることだけが要求され、OPに表示されるクラスは簡単にコピー可能です。 – bames53

+3

「フルスペシャライゼーションを提供する」は、他のタイプがサポートされていないことを意味するものではなく、スペシャライゼーションによって実装されていないことのみを意味します。一般的なテンプレート 'std :: atomic'は簡単にコピー可能な型を扱います。数値型の特殊化は、任意のユーザー定義型には適用できない追加のメンバー関数(算術演算など)を提供します。 –

+0

それは、コンストラクタが省略されている場合、例がリンクする必要があるということではありませんか?私はそれをコメントアウトする場合、私はまだ同じエラーが発生しています。 – yvanvds

0

チェック。 GNUのlibstdC++で、C++ 11のサポートまたはlibC++でなければなりません。

希望すると助かります。

+0

ありがとうございます。これらの設定を確認するとよいでしょう。この場合、これは問題ではありませんが、主にこれらの設定がxcode 4.6の標準であるようです。 – yvanvds

+0

私のMacでプログラムをチェックしても同じエラーが発生しました。標準ライブラリやサポートされていない機能のバグのように見える – inkooboo

関連する問題