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

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

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



たとえば、macOS プラットフォームでは、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 macOS
#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 を指定します。

関連項目