web-dev-qa-db-fra.com

stockage local de threads c ++ clang-503.0.40 (Mac OSX)

Après avoir déclaré une variable de cette manière:

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

j'ai essayé de compiler mon code en utilisant 'g ++ -std = c ++ 0x -pthread [fichier source]'. Je reçois l'erreur suivante:

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

Si j'essaie de compiler le même code sous Linux avec GCC 4.8.1 avec les mêmes drapeaux, j'obtiens un fichier exécutable fonctionnel. J'utilise clang-503.0.40 (celui fourni avec Xcode 5.1.1) sur un MacBook Pro sous OSX 10.9.3. Quelqu'un peut-il m'expliquer ce que je fais mal? Je vous remercie!!

15
pier94

Essayez clang++ -stdlib=libc++ -std=c++11. La bibliothèque obsolète libstdc ++ d’OS X ne prend pas en charge TLS.

Modifier

Ok, cela fonctionne pour la version normale mais pas pour la version Xcode.

Je ai fait un diff contre clang d'Apple (503.0.38) et le normale publié un et a trouvé la différence suivante:

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

Donc, je pense que c'est un bogue dans la version clang d'Apple (ou qu'ils l'ont gardé exprès - mais toujours bizarre, parce que -v dit basé sur 3.4).

5
Thomas

Vous pouvez également utiliser des extensions de compilateur telles que __thread (GCC/Clang) ou __declspec(thread) (Visual Studio). 

Enveloppez-le dans une macro et vous pourrez facilement transférer votre code sur différents compilateurs et versions linguistiques:

#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

Le compilateur Clang inclus dans les versions bêta de Xcode 8 et GM prend en charge le mot clé C++ 11 thread_local avec -std=c++11 et -std=c++14 (ainsi que les variantes de GCC).

Les versions antérieures de Xcode prenaient apparemment en charge le stockage local des threads de style C en utilisant les mots clés __thread ou _Thread_local, selon la vidéo WWDC 2016 "What's New in LLVM" (voir la discussion commençant à 5:50).

2
rsfinn

On dirait que vous devrez peut-être définir la version minimale d’OS X que vous ciblez à 10.7 ou plus.

0
C. Scott Ananian