2013-04-17 6 views

risposta

7

UPDATE: Jonathan Wakely gentilmente guardato il problema di un he says (below in comments) che -pthread deve essere passato sia al compilatore e il linker . Se lo faccio, anche il codice non fallisce con gcc 4.7.2. Quindi la risposta non ha apparentemente nulla a che fare con l'e-mail citata. Grazie Jonathan!


Ecco alcune citazioni dritto formano lo sviluppatore gcc Jonathan Wakely's mail, scritto nel 2011:

Tutti gli operatori di confronto sulla nostra std :: :: filo id contare su indefinito comportamento perché il nostro thread :: id è solo un pthread_t.

[...]

2) operatore == utilizza pthread_equal, che non è definito per invalidi ID filo , POSIX dice:

If either t1 or t2 are not valid thread IDs, the behavior is undefined. 
Anche se è stato scritto due anni fa , probabilmente si applica ancora. Al momento non riesco a controllare la codebase di gcc per aggiungere altro.

Strano. Il seguente codice:

#include <iostream> 
#include <thread> 

int main() { 

    std::cout << "Started" << std::endl; 

    std::thread::id nobody; 

    if (nobody != std::this_thread::get_id()) { 

     std::cout << "OK" << std::endl; 
    } 

    std::cout << "Finished" << std::endl; 
} 

produce:

Started 
OK 
Finished 

Controllare here. Tuttavia il tuo codice non funziona con 4.7.2.

+1

Fallisce solo con 4.7.2 se non si passa '-pthread' al compilatore e al linker. Presumibilmente 'pthread_equal' restituisce sempre true quando non si collega a' libpthread.so', immagino che sia un bug in '', quindi è meglio sistemarlo –

+2

Per essere chiari, non penso che questo sia qualcosa fare con la posta che citi, ha a che fare con il tentativo di usare 'std :: thread' e non il collegamento con' -pthread' –

+0

@JonathanWakely Sì, ora ho capito, aggiorno subito la risposta. – Ali

6

Non ho accesso allo standard C++ 11, ma dalle ultime progetto di norma n3485 [thread.thread.id]

Un oggetto di tipo filo :: id fornisce un unico fi catore identi per ogni thread di esecuzione e un unico valore distinto per tutti gli oggetti discussione che non rappresentano un thread di esecuzione (30.3.1)

seguita da

id) noexce (pt; E ffce: costruisce un oggetto di tipo id. Postconditions: l'oggetto costruito non rappresenta un thread di esecuzione.

Questo sembra implicare che ciò che si sta osservando è un bug in gcc