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

De RAD Studio
Aller à : navigation, rechercher

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.

Voir aussi