2010-10-11 28 views
1


j'ai commencé à jouer avec boost :: discussions, mais je suis un peu coincé avec ce problème:Utilisation d'exceptions dans un boost :: thread thread

Je ne comprends pas pourquoi ce programme se bloque comme Dès que l'exception est levée, parce que j'essaie de l'attraper dans le fil. Je pensais qu'il serait possible de travailler avec des exceptions aussi longtemps que la manipulation se passe dans le même fil que le lancer?

#include <boost/thread.hpp> 
#include <exception> 

using namespace std; 

void doWork(); 
void thrower(); 

int main(int argc, char** argv){ 
boost::thread worker(doWork); 
worker.join(); 
return 0; 
} 

void doWork(){ 
try{ 
    thrower(); 
} 
catch(const exception &e){ 
    //handle exception 
} 
} 
void thrower(){ 
// program terminates as soon as the exception is thrown 
throw exception(); 
} 

Informations complémentaires:
* Utilisation MingW32
* Boost v.1.44
* Liaison dynamique contre la dll de débogage multithread Version du fil lib

+0

Ce ne sera même pas compiler sans déclarations appropriées en marche avant et 'l'aide std' d'espace de noms. Mais si je les ajoute, ça fonctionne très bien sur Ubuntu Linux avec Boost 1.40. –

+0

Désolé, il s'agit d'une version réduite du code, pour afficher le problème. Avez-vous lié statiquement ou dynamiquement? – zitroneneis

+0

Fonctionne bien pour moi aussi. Mac OS X utilisant Boost 1.44 lié dynamiquement. –

Répondre

2

J'ai trouvé le problème: c'est un bug dans la bibliothèque boost qui ne se produit que lorsque vous travaillez avec une version de minGW plus récente que 3.17. Boost trac ticket #4258

Après application de la solution proposée, et le réglage de la préprocesseur Définition BOOST_THREAD_USE_LIB Je suis maintenant capable de se lier à la bibliothèque statique, et je peux travailler avec des exceptions, aussi longtemps qu'ils sont pris dans le même fil qui jette leur.

vous réservoir beaucoup pour vos commentaires

0

Dans les applications se composant de plusieurs bibliothèques partagées vous devrez peut-être faire très attention à la visibilité de vos exceptions. gcc ne rend pas les informations RTTI pour les exceptions visibles de l'extérieur d'une bibliothèque partagée par défaut, entraînant la disparition des exceptions sur les limites des bibliothèques partagées. Voir here pour une description détaillée et les pièges possibles.

Certainement, je ne peux pas être sûr que vous faites face à ce problème, mais de ce que vous décrivez c'est une possibilité.

+0

wow, c'est des choses intéressantes. Heureusement pour moi, ce n'était pas le problème dans mon cas. Merci beaucoup pour l'idée quand même – zitroneneis