Lea el Wikipedia entry.
El almacenamiento local de subprocesos no es algo particular de C++. Algunas veces recibe diferentes nombres, como "TLS" (solo abreviatura de almacenamiento local de subprocesos) o "almacenamiento específico de subprocesos" (TSS).
La mayoría de los sistemas operativos proporcionan API para acceder al almacenamiento por subproceso. Por ejemplo, Windows tiene un bunch of API functions comenzando con "TLS". Bajo el capó, Win32 reserva un área especial para una variedad de datos por subproceso, incluido el almacenamiento local de subprocesos de usuario, accesible a través de un registro de CPU particular (FS en x86). Linux proporciona almacenamiento específico de subprocesos a través de las API pthread, con nombres como pthread_key_create, y estos generalmente se implementan usando una técnica similar.
Es posible que un sistema operativo no proporcione ningún tipo de soporte. Sin embargo, si el sistema operativo proporciona un ID de subproceso único de proceso a través de una API, entonces la biblioteca de tiempo de ejecución C++ podría mantener algo conceptualmente como un std::map<thread_id, per_thread_storage>
internamente. Por supuesto, entonces hay un problema de qué es per_thread_storage
. Si un programa estaba enlazado estáticamente, podría ser algo así como un puntero a una estructura grande con todas las variables de almacenamiento locales de subprocesos declaradas en el programa como elementos. Esto es una simplificación excesiva, pero se entiende la idea general.
El acceso a las variables de almacenamiento locales de subprocesos obviamente no es solo una lectura o escritura de memoria recta. Es potencialmente un poco más complicado que eso. Si va a utilizar mucho el almacenamiento local/específico de subprocesos en una función particular, le recomiendo que primero copie el puntero de almacenamiento local de subprocesos en una variable local.
El estándar C++ tiene cero (o muy poco) detalles de implementación. –
Esto ahora puede ayudar: http://www.akkadia.org/drepper/tls.pdf –