44 votes

Pourquoi cette simple std::thread exemple à ne pas travailler?

Essayé l'exemple suivant compilé avec g++ -std=gnu++0x t1.cpp et g++ -std=c++0x t1.cpp , mais à la fois de ces résultats, dans l'exemple de l'abandon.

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

Voici un exemple:

#include <thread>
#include <iostream>

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;
}

Je suis d'essayer ce sur Ubuntu 11.04:

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

Quelqu'un sait ce que j'ai manqué?

46voto

rubenvb Points 27271

Vous avez d' join std::threads, tout comme vous devez joindre pthreads.

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

Mise à JOUR: Ce rapport de bogue Debian m'a indiqué la solution: ajouter -pthread de votre commande en ligne. C'est probablement une solution de contournement jusqu'à ce que l' std::thread code stabilise et g++ tire que de la bibliothèque dans la quand il le faut (ou pas toujours, pour le C++).

13voto

SarB Points 121

Veuillez utiliser la bibliothèque pthread lors de la compilation: g++ -lpthread.

3voto

Eric Leschinski Points 14289

La plus simple code à reproduire cette erreur et comment la corriger:

Mettez ceci dans un fichier appelé s.cpp:

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

Compiler comme ceci:

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

Courir comme ça, l'erreur se produit:

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

Pour le fixer, de le compiler comme ça avec l'-pthread drapeau:

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

Puis il fonctionne correctement:

task1 says: hello

-3voto

CPlusPlusUser Points 19

Vous avez besoin de lien pour le moment de l'exécution de la bibliothèque

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X