2010-11-29 2 views
0

Ich habe in dieser Anwendung für ein kleines Problem mit diesem Problem gekämpft und so habe ich versucht, das Problem in einem einfachen Code-Snippet zu reproduzieren.Verwalten von io_service in einem anderen Thread, seltsames Problem mit Ausnahmen

Ich verwende Boost 1.44 und mingw32-g ++ Version 4.4.1. auf Windows XP

Mein erwartetes Ergebnis für das folgende Programm:

>messageservice.exe 

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

Aber in Wirklichkeit das es manchmal tut, manchmal stürzt verbosely "nicht behandelte Ausnahme win32 ..." (mit Just In Time Debugger), und manchmal stürzt es still

So bin ich ratlos, warum es das tut.

Wenn ich den try ... catch-Block entfernen, läuft das Programm gut. Hier

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

Ist es illegal eine io_service Instanz in einem Nicht-Haupt-Thread zu verwalten? oder habe ich etwas offensichtlich blind gemacht !?

Schätzen Sie jede Hilfe!

Dank

+0

Ihr Code läuft für mich ohne Abstürze mit Win XP, Boost 1.44 und Visual Studio 2008. Sie wissen, dass der io_service in Ihrem Beispiel nichts tut, da die Ereignisschleife nicht gestartet wurde (call io_service run() oder) Renne einmal())? – nabulke

Antwort

1

Dank Matt Gruenke für die Lösung (http://news.gmane.org/gmane.comp.lib.boost.asio.user)

Offensichtlich sichere Ausnahmen aufweist, ist ein Faden optional extra in mingw. Ich musste die Option -mthreads angeben, wenn ich verknüpfe

Ich denke, ich bin naiv in der Annahme, dass dies eine Always-on-Kerngarantie sein sollte!