¿Por qué este simple ejemplo de std :: thread no funciona?

Intenté el siguiente ejemplo comstackdo con g++ -std=gnu++0x t1.cpp y g++ -std=c++0x t1.cpp pero ambos dan como resultado el g++ -std=c++0x t1.cpp del ejemplo.

 $ ./a.out terminate called after throwing an instance of 'std::system_error' what(): Aborted 

Aquí está la muestra:

 #include  #include  void doSomeWork( void ) { std::cout << "hello from thread..." << std::endl; return; } int main( int argc, char *argv[] ) { std::thread t( doSomeWork ); t.join(); return 0; } 

Estoy intentando esto en Ubuntu 11.04:

 $ g++ --version g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 

¿Alguien sabe lo que me he perdido?

Tienes que join std::thread s, al igual que tienes que unir pthreads .

 int main( int argc, char *argv[] ) { std::thread t( doSomeWork ); t.join(); return 0; } 

ACTUALIZACIÓN: Este informe de errores de Debian me señaló la solución: agregue -pthread a su línea de comandos. Probablemente esto sea una solución hasta que el código std::thread estabilice y g ++ extraiga esa biblioteca cuando debería (o siempre, para C ++).

Utilice la biblioteca pthread durante la comstackción: g ++ -lpthread.

Código más simple para reproducir ese error y cómo solucionarlo:

Pon esto en un archivo llamado s.cpp:

 #include  #include  #include  #include  #include  using namespace std; void task1(std::string msg){ cout << "task1 says: " << msg; } int main(){ std::thread t1(task1, "hello"); usleep(1000000); t1.detach(); } 

Comstackr de esta manera:

 el@apollo:~/foo7$ g++ -os s.cpp -std=c++0x 

Ejecútelo así, el error ocurre:

 el@apollo:~/foo7$ ./s terminate called after throwing an instance of 'std::system_error' what(): Operation not permitted Aborted (core dumped) 

Para solucionarlo, compílelo así con el indicador -pthread:

 g++ -os s.cpp -std=c++0x -pthread ./s 

Entonces funciona correctamente:

 task1 says: hello 

Por lo que vale, tuve un problema diferente con un código similar usando hilos en g ++ (MinGW). La solución alternativa consistía en poner un poco de “retraso” entre crear un hilo y unirlo.

Código con aserción fallada con poca frecuencia:

 std::atomic_bool flag{false}; std::thread worker( [&] () { flag.store(true); } ); worker.join(); assert(flag.load()); // Sometimes fails 

Solución:

 std::atomic_bool flag{false}; std::thread worker( [&] () { flag.store(true); } ); while (not flag.load()) { std::this_thread::yield(); } worker.join(); assert(flag.load()); // Works fine 

Tenga en cuenta que yield() solo no ayudó, por lo tanto, el ciclo while. Usar sleep_for(...) también funciona.

Necesita vincular a la biblioteca de tiempo de ejecución