web-dev-qa-db-ja.com

c ++スレッドローカルストレージclang-503.0.40(Mac OSX)

この方法で変数を宣言した後:

   #include <thread>
   namespace thread_space
    {
    thread_local int s;
    } //etc.

'g ++ -std = c ++ 0x -pthread [sourcefile]'を使用してコードをコンパイルしようとしました。次のエラーが発生します。

example.C:6:8: error: thread-local storage is unsupported for the current target
static thread_local int s;
       ^
1 error generated.

LinuxでGCC4.8.1を使用して同じフラグを使用して同じコードをコンパイルしようとすると、機能する実行可能ファイルが取得されます。 OSX10.9.3を実行しているMacBookProでclang-503.0.40(Xcode 5.1.1に付属しているもの)を使用しています。誰かが私が間違っていることを私に説明できますか?ありがとうございました!!

16
pier94

clang++ -stdlib=libc++ -std=c++11をお試しください。 OSXの古いlibstdc ++はTLSをサポートしていません。

編集

わかりました。これは通常のclangバージョンでは機能しますが、Xcodeバージョンでは機能しません。

Appleのclang(503.0.38)通常リリースされたもの に対して差分をとったところ、次の違いが見つかりました。

        .Case("cxx_thread_local",
-                 LangOpts.CPlusPlus11 && PP.getTargetInfo().isTLSSupported() &&
-                 !PP.getTargetInfo().getTriple().isOSDarwin())
+                 LangOpts.CPlusPlus11 && PP.getTargetInfo().isTLSSupported())

したがって、これはAppleのclangバージョンのバグだと思います(または、意図的にそこに保持していましたが、-vが3.4に基づいているため、それでも奇妙です)。

5
Thomas

または、 ___thread_ (GCC/Clang)や __declspec(thread) (Visual Studio)などのコンパイラ拡張機能を使用することもできます。

マクロでラップすると、さまざまなコンパイラや言語バージョン間でコードを簡単に移植できます。

_#if HAS_CXX11_THREAD_LOCAL
    #define ATTRIBUTE_TLS thread_local
#Elif defined (__GNUC__)
    #define ATTRIBUTE_TLS __thread
#Elif defined (_MSC_VER)
    #define ATTRIBUTE_TLS __declspec(thread)
#else // !C++11 && !__GNUC__ && !_MSC_VER
    #error "Define a thread local storage qualifier for your compiler/platform!"
#endif

...

ATTRIBUTE_TLS static unsigned int tls_int;
_
3
glampert

Xcode8ベータ版およびGMリリースに含まれるclangコンパイラーは、thread_localおよび-std=c++11の両方でC++ 11 -std=c++14キーワードをサポートします(およびGCCバリアント)。

Xcodeの以前のバージョンは、キーワード__threadまたは_Thread_localを使用してCスタイルのスレッドローカルストレージをサポートしていたようです。 WWDC 2016ビデオ「LLVMの新機能」 (説明を参照) 5:50から)。

2
rsfinn

ターゲットとするOSXの最小バージョンを10.7以上に設定する必要があるようです。

0