ライブラリ内のカスタム クラスで 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 で実装されるべきものを超えているようです。
では、ここからどう行くか?いくつかのオプションが表示されます。
- このクラスにはアトミックを使用しないでください。私の特定のケースでは、私のベクトルクラスがコード全体で使用されているため、これは非常に困難です。ミューテックスをロックおよびロック解除すると、おそらく処理が大幅に遅くなります。
- アトミックの関数を自分で実装します。それは私には非常に複雑に見えます。最後のオプションとして保存します。
- boost::atomic で何かできるかどうかを確認します。これは一見うまくいくように見えます。ただし、さらにテストを行う必要があります。