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