W8136 L'initialisation des données TLS n'est pas prise en charge sur cette plate-forme (C++)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Erreurs et avertissements du compilateur (C++) - Index



Sur la plate-forme Mac OS X, par exemple, les variables TLS (Thread Local Storage) sont mises à zéro et elles ne peuvent pas être initialisées à 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 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;
 }

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.

Voir aussi