2013-10-14 10 views
5

Ciao Ho problema con fili in C++ 11. Ho Ubuntu 64 bit 13.10 (test) con g ++ 4.8.1. ho provato a compilare il codice:C++ 11 filettatura errore di runtime

#include <thread> 

void func() 
{ 
    // do some work 
} 

int main() 
{ 
    std::thread t(func); 
    t.join(); 
    return 0; 
} 

con le opzioni: -std = C++ 11 -pthread -lpthread. Compilation ha avuto successo, ma quando ho provato a farlo funzionare, ho ricevuto un errore:

terminate called after throwing an instance of 'std::system_error'
what(): Enable multithreading to use std::thread: Operation not permitted

+0

Potresti provare con -pthread -std = C++ 11? (Senza -lpthread) – sphair

+1

Sembra che le altre persone hanno questo problema https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1228201 – log0

risposta

2

Sembra che le questioni di ordine, o almeno, questo è ciò che viene detto in questa discussione: C++ Threads, std::system_error - operation not permitted?

+1

corretta. E non ho mai saputo perché _exactly_, ma questo lo spiega: http://stackoverflow.com/questions/18827938/strange-g-linking-behavior-depending-on-arguments-order In sostanza, se usi '-lwhatever' _before_ il file che ha bisogno della libreria, il linker lo elimina poiché non ha visto nessuno dei simboli utilizzati finora. – stefan

+0

librerie sì collegate devono essere sul lato destro del file che ne ha bisogno. Ma è davvero il problema dell'OP? Sembra che altre persone abbiano lo stesso problema su Ubuntu 13.10. – log0

6

Penso che le altre risposte siano un po 'fuorvianti. Ciò che è importante è che hai solo bisogno di -pthread. L'ordine di questo flag non è importante!

-pthread collegherà automaticamente con libpthread e lo farà in modo corretto. Si noti che è necessario fornire questa opzione sia durante la compilazione di e che collega il codice (tranne quando si fa tutto in una volta, ovviamente).

Solo quando si fornisce esplicitamente, l'ordine di dove si inserisce potrebbe essere importante, ma come già accennato, non è necessario aggiungerlo esplicitamente quando si utilizza -pthread.

+0

L'uso di '-pthread' non è di aiuto in questo caso. Ho lo stesso ambiente e l'unica soluzione è [questo] (http://stackoverflow.com/a/19359353/476681) –