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 つの回答はすべて役に立ちますが、情報が最も多いため、andrey の回答を確認しました。私はこれの専門家ではありませんが (明らかに)、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 の 1 つの特殊
化 2) 整数型の特殊化と typedef
3) すべてのポインター型の std::atomic

Boost.Atomicはどうですか。Boost.Atomic の制限で説明されているように:

非 POD クラスをテンプレート パラメーターとしてアトミックに使用すると、未定義の動作が発生します。

于 2013-04-08T19:18:09.677 に答える
0

プロジェクトページclangコンパイラ設定で、使用している標準ライブラリを確認してください。これは、c++11 をサポートする GNU の libstdc++ または libc++ である必要があります。

それが役立つことを願っています。

于 2013-04-08T19:13:38.963 に答える