W8136 Initialisierung von TLS-Daten wird auf dieser Plattform nicht unterstützt. (C++)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Compiler-Fehler und -Warnungen (C++) - Index



Auf der OS X-Plattform sind beispielsweise TLS-Variablen (Thread-lokale Speichervariablen) mit null initialisiert und können nicht mit einem anderen Wert initialisiert werden.

Diese Variablen müssen zur Laufzeit initialisiert werden. Wenn TLS-Variablen Nicht-Nullwerte haben sollen, dann muss jeder Thread, einschließlich des Haupt-Threads, diese Variablen, wie im folgenden Beispiel gezeigt, initialisieren:

 #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;
 }

Ohne die Aufrufe von initTLSVars() für den Mac würde das Programm Nullen für die drei Thread-lokalen Speichervariablen ausgeben.

Unter Windows muss initTLSVars() nicht aufgerufen werden, weil das BS eine integrierte TLS-Unterstützung bereitstellt.

Diese Warnung ist per Voreinstellung aktiviert. Übergeben Sie zur Deaktivierung dieser Warnung -w-itl oder -w-8136 an den Compiler.

Siehe auch