2010-11-29 3 views
0

J'ai eu de la difficulté avec ce problème pendant un petit moment dans mon application et j'ai donc essayé de reproduire le problème dans un simple fragment de code. J'utilise Boost 1.44 et mingw32-g ++ 4.4.1. Windows XPGestion de io_service dans un autre thread, problème étrange avec des exceptions

Mon résultat attendu pour le programme suivant est:

>messageservice.exe 

[debug]BEFORE EXCEPTION **** 
[error]EXCEPTION HANDLED **** 
[debug]AFTER TRY/CATCH 
> 

Mais en réalité, il fait parfois cela, se bloque parfois verbeux « exception non gérée win32 ... » (avec Just Débogueur Time), et parfois il se bloque silencieusement

Donc je ne sais pas pourquoi il le fait.

Si je supprime le bloc try ... catch, le programme fonctionnera correctement.

Voici le code:

#include <iostream> 
#include <string> 

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


#define L_(lvl) std::cout<<"\n["<<#lvl<<"]" 


void nothingfun() { } /* an empty job */ 

void threadfun() { 
    boost::asio::io_service myIoService; /* thread's own io_service object */ 

    for(int i=0;i<10000;i++) { 
     myIoService.post(&nothingfun); 
    } 
} 


int main() 
{ 
    boost::thread t(&threadfun); 


    L_(debug)<<"BEFORE EXCEPTION ****"; 
    try{ 
     throw "aaah!"; 
    } catch(...) { 
     L_(error)<<"EXCEPTION HANDLED ****"; 
    } 
    L_(debug)<<"AFTER TRY/CATCH"; 

    t.join(); 

    return 0; 
} 

est-il illégal de gérer une instance de io_service dans un thread non principal? ou est-ce que j'ai fait quelque chose d'aveuglement manifestement faux?

Appréciez toute aide!

Merci

+0

Votre code s'exécute pour moi sans crash en utilisant Win XP, Boost 1.44 et Visual Studio 2008. Vous êtes conscient du fait que le io_service ne fera rien dans votre exemple puisque la boucle d'événement n'est pas démarrée (appelez io_service run() ou exécuter une fois())? – nabulke

Répondre

1

Merci à Matt Gruenke pour la solution (http://news.gmane.org/gmane.comp.lib.boost.asio.user)

Apparemment fil ayant des exceptions de sécurité est une option supplémentaire à mingw. Je devais spécifier l'option -mthreads lors de la liaison

Je suppose im naive en pensant que cela devrait être une garantie de base toujours sur!