Подтвердить что ты не робот

С++ поток-локальное хранилище clang-503.0.40 (Mac OSX)

После того, как я объявил переменную таким образом:

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

Я попытался скомпилировать свой код, используя 'g++ -std = С++ 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 с GCC 4.8.1 с теми же флагами, я получаю исполняемый исполняемый файл. Я использую clang-503.0.40 (тот, который поставляется с Xcode 5.1.1) на MacBook Pro с OSX 10.9.3. Может ли кто-нибудь объяснить мне, что я делаю неправильно? Спасибо!

4b9b3361

Ответ 1

Попробуйте clang++ -stdlib=libc++ -std=c++11. OS X устаревший libstdС++ не поддерживает TLS.

Edit

Хорошо, это работает для нормальной версии 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).

Ответ 2

В качестве альтернативы вы можете использовать расширения компилятора, такие как __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

Компилятор clang, включенный в версии Xcode 8 Beta и GM, поддерживает ключевое слово С++ 11 thread_local с -std=c++11 и -std=c++14 (а также с вариантами GCC).

Более ранние версии Xcode, по-видимому, поддерживали локальное хранилище потоков C-стиля с использованием ключевых слов __thread или _Thread_local, согласно видео WWDC 2016 "Что нового в LLVM" (см. обсуждение, начинающееся в 5:50).

Ответ 4

Похоже, вам может потребоваться установить минимальную версию OS X, на которую вы нацелились, до 10.7 или выше.