W8136 L'initialisation des données TLS n'est pas supportée sur cette plate-forme (C++)
Remonter à Erreurs et avertissements du compilateur (C++) - Index
Sur la plate-forme macOS, par exemple, les variables TLS (Thread Local Storage) sont mises à zéro et elles ne peuvent pas être initialisées sur une autre valeur.
Vous devez initialiser les variables TLS à l'exécution. Chaque thread, notamment le thread principal, doit initialiser les variables TLS si une valeur différente de zéro est attendue pour ces variables, comme illustré dans l'exemple suivant :
#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;
}
Sans les appels à initTLSVars() pour le Mac, le programme imprimerait des zéros pour les trois variables de stockage locales au thread.
Sur Windows, il n'est pas nécessaire d'appeler initTLSVars(), car le système d'exploitation fournit un support TLS intégré.
Cet avertissement est activé par défaut. Pour désactiver cet avertissement, passez -w-itl ou -w-8136 au compilateur.