Domanda

A partire da pthreads, non riesco a capire quale sia il business con pthread_key_t e pthread_once_t?

Qualcuno spiegherebbe in termini semplici con esempi, se possibile?

grazie

È stato utile?

Soluzione

No, non può essere spiegato in termini laici. I laici non possono programmare con successo con pthreads in C ++. Ci vuole uno specialista noto come "programmatore di computer" : -)

pthread_once_t è un po 'di spazio di archiviazione a cui pthread_once deve accedere per assicurarsi che faccia quello che dice sulla scatola. Ciascun controllo una volta consentirà di chiamare una routine init una volta, e una volta sola, non importa quante volte viene chiamata da quanti thread, possibilmente contemporaneamente. Normalmente usi un controllo una volta diverso per ogni oggetto che stai pianificando di inizializzare su richiesta in modo thread-safe. Puoi considerarlo in effetti come un intero a cui si accede atomicamente come un flag se un thread è stato selezionato per fare l'init. Ma poiché pthread_once sta bloccando, immagino che ci sia un po 'più di questo se l'implementazione può stipare anche in una primitiva di sincronizzazione (l'unica volta che ho mai implementato pthread_once , Non ho potuto, quindi il controllo di una volta ha preso uno dei 3 stati (inizio, inizializzazione, fine). Ma poi non ho potuto cambiare il kernel. Situazione insolita).

pthread_key_t è come un indice per accedere all'archivio locale thread. Puoi pensare a ogni thread come avere una mappa dalle chiavi ai valori. Quando aggiungi una nuova voce a TLS, pthread_key_create sceglie una chiave per essa e la scrive nella posizione specificata. Quindi si utilizza quella chiave da qualsiasi thread, ogni volta che si desidera impostare o recuperare il valore di quell'elemento TLS per il thread corrente. Il motivo per cui TLS ti fornisce una chiave invece di permetterti di sceglierne una, è che le librerie non correlate possono usare TLS, senza dover cooperare per evitare sia di usare lo stesso valore sia di distruggere reciprocamente i dati TLS. La libreria pthread potrebbe ad esempio mantenere un contatore globale e assegnare la chiave 0 per la prima volta viene chiamato pthread_key_create , 1 per il secondo e così via.

Altri suggerimenti

pthread_key_t è per la creazione di thread archiviazione locale thread : ogni thread ottiene la propria copia di una variabile di dati, anziché tutti i thread che condividono una variabile globale (o funzione-statica, classe-statica). Il TLS è indicizzato da una chiave. Vedi pthread_getspecific e altri per maggiori dettagli.

pthread_once_t è un controllo per eseguire una funzione una sola volta con pthread_once . Supponiamo di dover chiamare una routine di inizializzazione, ma devi chiamarla solo una volta. Inoltre, il punto in cui devi chiamarlo è dopo che hai già avviato più thread. Un modo per farlo sarebbe usare pthread_once () , il che garantisce che la tua routine verrà chiamata una sola volta, indipendentemente da quanti thread provino a chiamarla contemporaneamente, purché tu usi lo stesso variabile di controllo in ogni chiamata. Spesso è più facile usare pthread_once () che usare altre alternative.

Caspita, le altre risposte qui sono troppo dettagliate.

pthread_once_t memorizza lo stato per pthread_once () . Chiamando pthread_once (& amp; s, fn) chiama fn e imposta il valore indicato da s per registrare il fatto che è stato eseguito. Tutte le chiamate successive a pthread_once () sono noops. Il nome dovrebbe diventare ovvio ora.

pthread_once_t deve essere inizializzato su PTHREAD_ONCE_INIT .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top