2015-09-28 14 views
7

Dalla mia esperienza, sembra che il risultato diÈ std :: thread :: id univoco tra i processi?

std::this_thread::get_id() 

è unico in tutta processo: ids sono diversi da un processo all'altro.

È garantito dallo standard?

+0

Stai chiedendo specificamente per gcc su linux adesso o per C++ in generale? Le risposte sembrano essere diverse. – nwp

+0

La mia domanda riguarda lo standard C++ in generale. Sto cercando una risposta su tutte le piattaforme e tutti i compilatori. –

+5

Lo standard non ha alcun concetto di "processo", nessuna idea che vari programmi possano essere eseguiti contemporaneamente e interagire. Quindi la domanda non può nemmeno essere formulata nei termini standard, per non parlare della risposta. Tutto quello che puoi chiedere è "cosa farebbe una tipica implementazione?" –

risposta

1

std :: thread è implementato in cima a pthreads in un ambiente che supporta pthreads. Quindi non c'è nessuna garanzia (portatile).

Da pthread_self manuale:

ID della discussione sono garantiti per essere unici solo all'interno di un processo. A
ID thread può essere riutilizzato dopo che un thread terminato è stato aggiunto o un thread separato è terminato.

+3

Questo non risponde alla domanda di cosa richiede lo standard C++, significa semplicemente che se lo standard C++ richiede che gli ID di thread siano univoci tra i processi, un'implementazione non può semplicemente riutilizzare gli ID pthread. (Ma è probabile che lo standard C++ non richieda che gli ID di thread siano univoci tra i processi.) – hvd

+0

@hvd yes, ma std :: thread è implementato in cima a pthreads in un ambiente che supporta pthreads. Quindi non c'è nessuna garanzia (portatile). – PSIAlt

+2

Puoi aggiungere una fonte per la clam che 'std :: thread' è implementato nella parte superiore di pthreads dove disponibile? Non riesco a immaginare lo standard che richiede questo.Sono anche abbastanza sicuro che Windows è un controesempio, poiché i pthread sono disponibili e non vengono utilizzati per implementare 'std :: thread', entrambi utilizzano invece implementazioni native di WinApi. Ma poi di nuovo non sarebbe la prima volta che Microsoft non è conforme allo standard. – nwp

2

Lo standard garantisce che gli ID di thread sono univoci su thread diversi, inoltre afferma che gli ID di thread terminati potrebbero essere riutilizzati. Non specifica i processi e non riconosce la loro esistenza, pertanto, non garantisce l'univocità tra i processi.

30.3.1.1

  1. Un oggetto di tipo filetto :: id fornisce un identificatore univoco per ogni thread di esecuzione e un singolo valore distinto per tutte le filettature oggetti che non rappresentano un thread di esecuzione (30.3.1). Ogni thread di esecuzione ha un oggetto thread :: id associato che non è uguale all'oggetto thread :: id di qualsiasi altro thread di esecuzione e che non è uguale all'oggetto thread :: id di qualsiasi std :: thread oggetto che non rappresenta i thread di esecuzione.
  2. thread :: id deve essere una classe banalmente copiabile (clausola 9). La libreria può riutilizzare il valore di un thread :: id di un thread terminato che non può più essere unito.

Lo standard nasconde anche via l'attuazione di un filo :: id, potrebbe essere un int o qualcos'altro.