2012-01-25 2 views
7

Ho difficoltà a capire come funzionano pthread_key_t e pthread_key_create. Da quanto ho capito, ogni thread ha TLS (thread local storage) e una chiave viene utilizzata per accedere alla memoria locale del thread. Quello che non capisco è quando viene creata una chiave, ogni thread la usa? Diciamo che Thread 0 crea la chiave 0, può Thread 1 quindi usare la chiave 0? Se Thread 1 utilizzava la chiave 0, avrebbe accesso al proprio TLS o Thread 0 di TLS?Come funzionano pthread_key_t e il metodo pthread_key_create?

C'è qualche array globale o qualcosa che tiene traccia di tutti i tasti utilizzati?

risposta

5

pthread_keys sono esattamente ciò che hai detto, thread storage locale a cui fa riferimento una chiave comune. Quindi più thread utilizzano la stessa chiave, ma ottengono spazio di archiviazione diverso (per thread).

Un esempio veloce (troppo forzato), affermano che stavi creando un server asincrono (come IMAP). È possibile tenere traccia delle connessioni client in un array, ciascuna con una chiave per l'attività/richiesta corrente. Quindi, quando una richiesta arriva in un nuovo thread viene attivata e il thread memorizza nella chiave Client_Connection-> WhatAmIDoing un puntatore alla struttura "request". Il thread ora non dovrebbe passare attorno a quel puntatore perché qualsiasi funzione che esegue thread potrebbe semplicemente chiamare la funzione pthread_getspecific() e ottenere il puntatore a ciò che dovrebbe fare.

+1

Quindi, guardando il codice sorgente per pthread_key_create, imposta una variabile, chiamata chiave, all'interno di pthread_key_t su qualsiasi cosa venga restituita da TlsAlloc. La chiave è un puntatore ma cosa viene restituito da TlsAlloc? è solo una serie di slot vuoti per ogni thread? Inoltre, se ogni thread ha il proprio spazio Tls, ogni elemento nell'array punta semplicemente allo spazio Tls dei thread? Mi sto solo confondendo da qualche parte e non so dove. Forse sto rendendo questo più complesso di quanto dovrebbe essere. – user972276

+2

Ben tecnicamente sì, il pthread_key è solo un puntatore a un array sparse, che viene creato quando si chiama la funzione _create. Quando un thread chiama la funzione _setspecific(), inserisce una voce nell'array con l'ID del thread e il valore memorizzato dalla funzione (nel mio esempio un puntatore a una struttura). Quando un thread chiama _getspecific() cerca l'array dalla chiave, quindi la voce in quell'array dall'ID thread, per trovare il valore memorizzato. –

+1

Ricordate il punto di queste interfacce è quello di astrarre ciò che accade dietro le quinte, in modo che il vostro programma non dipenda dalla piattaforma/implementazione. –