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?
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?
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.
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
@hvd yes, ma std :: thread è implementato in cima a pthreads in un ambiente che supporta pthreads. Quindi non c'è nessuna garanzia (portatile). – PSIAlt
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
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
- 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.
- 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.
Stai chiedendo specificamente per gcc su linux adesso o per C++ in generale? Le risposte sembrano essere diverse. – nwp
La mia domanda riguarda lo standard C++ in generale. Sto cercando una risposta su tutte le piattaforme e tutti i compilatori. –
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?" –