W8136 このプラットフォームでは TLS データの初期化はサポートされていません(C++)

提供: RAD Studio
移動先: 案内検索

コンパイラのエラーと警告(C++):インデックス への移動



たとえば、Mac OS X プラットフォームでは、TLS(スレッド ローカル ストレージ)変数は 0 に初期化され、その他の値に初期化することはできません。

TLS 変数は実行時に初期化しなければなりません。TLS 変数に 0 以外の値を持たせたい場合は、メインスレッドを含む各スレッドで、次の例のようにして TLS 変数を初期化しなければなりません。

 #include <stdio.h>
 #include <string.h>
 #include <process.h>
  
 int   __declspec(thread) iVal   = 1000;
 char  __declspec(thread) sVal[] = "ABCDEFG";
 float __declspec(thread) fVal   = 2.5;
  
 #if defined(__APPLE__)
 static void initTLSVars()
 {
   iVal = 1000;
   strcpy(sVal, "ABCDEF");
   fVal = 2.5;
 }
 #endif
  
 static void printTLSVars()
 {
   printf("Thread Id:(%08X) - ", __threadid());
   printf("iVal='%d', sVal='%s', fVal='%f'\n", iVal, sVal, fVal);
 }
  
 void threadHandler(void* /*data*/)
 {
   // TLS must be explicitly initialized on OSX
 #if defined(__APPLE__)
   initTLSVars();
 #endif  
   printTLSVars();
 }
  
 bool runThreads()
 {
 #if defined(__APPLE__)
   __borland_use_pthreads();
 #endif  
   _beginthread(&threadHandler, 0, 0);
   _beginthread(&threadHandler, 0, 0);
   return true;
 }
  
 int main()
 {
 #if defined(__APPLE__)
   initTLSVars();
 #endif  
   printTLSVars();
   runThreads();
   // Wait for input before terminating
   getchar();
   return 0;
 }

Mac の場合は initTLSVars() を呼び出さないと、このプログラムは 3 つのスレッド ローカル ストレージ変数に対して 0 を印刷します。

Windows の場合は、OS が組み込みの TLS サポートを提供しているため、initTLSVars() を呼び出す必要はありません。

この警告はデフォルトでは出力されます。この警告を出力しないようにするには、コンパイラに -w-itl または -w-8136 を指定します。

関連項目