Tengo algunos problemas para descubrir cómo funcionan pthread_key_t y pthread_key_create. Según tengo entendido, cada hilo tiene TLS (almacenamiento local de hilo) y una clave se utiliza para acceder al almacenamiento local de hilo. Lo que no entiendo es cuando se crea una clave, ¿todos los hilos pueden usarla? Digamos que el hilo 0 crea la clave 0, puede el hilo 1 y luego la tecla 0? Si el Tema 1 usara la clave 0, ¿accedería a su TLS propio o al TLS del Subproceso 0?¿Cómo funciona pthread_key_t y el método pthread_key_create?
¿Hay alguna matriz global o algo que haga un seguimiento de todas las claves que se utilizan?
Por lo tanto, al mirar el código fuente de pthread_key_create, establece una variable, llamada key, dentro de pthread_key_t a lo que se devuelve desde TlsAlloc. La clave es un puntero, pero ¿qué devuelve TlsAlloc? ¿Es solo un conjunto de ranuras vacías para cada hilo? Además, si cada subproceso tiene su propio espacio Tls, ¿cada elemento de la matriz solo apunta a los hilos de espacio Tls? Me estoy confundiendo en alguna parte y no sé dónde. Tal vez estoy haciendo esto más complejo de lo necesario. – user972276
Bien, técnicamente sí, pthread_key es solo un puntero a una matriz dispersa, que se crea cuando llamas a la función _create. Cuando un hilo llama a la función _setspecific(), rellena una entrada en el conjunto con el ID del hilo y el valor almacenado por la función (en mi ejemplo, un puntero a una estructura). Cuando un hilo llama a _específico() busca la matriz por la clave, luego la entrada en esa matriz por la identificación del hilo, para encontrar el valor almacenado. –
Recuerde que el objetivo de estas interfaces es abstraer lo que ocurre detrás de las escenas para que su programa no dependa de la plataforma/implementación. –