W8136 このプラットフォームでは TLS データの初期化はサポートされていません(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
を指定します。