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.