2012-01-25 12 views
7

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?

Respuesta

5

pthread_keys es justo lo que ha dicho, enhebrar el almacenamiento local al que hace referencia una clave común. Por lo tanto, varios subprocesos utilizan la misma clave, pero obtienen un espacio de almacenamiento diferente (por subproceso).

Un ejemplo rápido (inventado también), digamos que estaba creando un servidor asíncrono (como IMAP). Puede realizar un seguimiento de las conexiones de los clientes en una matriz, cada una con una clave para la tarea/solicitud actual. Por lo tanto, cuando llega una solicitud, se genera un nuevo hilo y el hilo almacena en la clave Client_Connection-> WhatAmIDoing un puntero a la estructura de "solicitud". El hilo ahora no tendría que pasar alrededor de ese puntero porque cualquier función que ejecute el hilo podría simplemente llamar a la función pthread_getspecific() y obtener el puntero a lo que se supone que debe hacer.

+1

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

+2

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. –

+1

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. –

Cuestiones relacionadas