2012-01-24 7 views
5

Durante la lettura del threading POSIX, ho trovato un esempio di dati specifici del thread. Ho avuto una zona di confusione nella mia mente ...Dati specifici del thread: perché non è possibile utilizzare solo una mappa statica con ID thread?

L'interfaccia filo-specifici per i dati sembra un po 'goffo, soprattutto una volta che si mescolano a dover utilizzare pthread_once, i vari inizializzatori, ecc

Is c'è qualche ragione per cui non posso semplicemente usare una statica std :: map dove la chiave è l'id pthread_self() e il valore dei dati è contenuto nella seconda parte di std :: pair?

Non riesco a pensare a un motivo per cui questo non funzionerebbe finché è stato avvolto in un mutex, ma non vedo alcun suggerimento o qualcosa di simile che mi confonde dato che suona molto più facile dell'API fornita . So che il threading può avere un sacco di catch-22, quindi ho pensato di chiedere e vedere se stavo per intervenire ... qualcosa di spiacevole? :)

risposta

5

non riesco a pensare a una ragione che questo non avrebbe funzionato fino a quando è stato avvolto in un mutex

Che di per sé è una buona ragione; implementato correttamente, è possibile accedere ai dati specifici del thread senza impedendo ad altri thread di creare o accedere simultaneamente a loro.

C'è anche l'efficienza generale (accesso costante di tempo, rispetto al tempo logaritmico se si utilizza std::map), nessuna garanzia che pthread_t ha un ordinamento adeguato definito, e la pulizia automatica insieme a tutte le altre risorse di thread.

È possibile utilizzare la parola chiave thread_local di C++ 11 o boost::thread_specific_ptr se non si desidera l'API Posix.

+0

+1, grazie per le parole chiave C++ 11, mi divertirò ad usarle quando arrivo a un progetto che lo supporta :) –

3
  1. pthread filo-specifici per i dati esistenti prima i contenitori della libreria standard
  2. filo-specifici dati evita la necessità di bloccaggio e si assicura altri pasticci filo con i dati
  3. I dati vengono puliti automaticamente quando il filo scompare

Detto questo, nulla ti impedisce di utilizzare la tua soluzione. Se si è certi che il contenitore sia stato interamente creato prima dell'esecuzione di qualsiasi thread (modello di threading statico), non è nemmeno necessario il mutex.

+0

Inoltre, pthread è un C api, non C++ – nos