Problem mit threads und try/catch



  • Hallo,
    ich habe folgendes problem:
    Ich habe eine Funktion die ich mit der boost thread library als thread laufen lasse . In dieser Funktion befindet sich ein try/catch gebilde. Wenn jetzt allerdings in dem try block eine exception ausgelößt wird die vond en catch blöcken aufgefangen werden könnte wird diese aber von dem try/catch block in meiner main funktion aufgefangen.
    Meine Fragen:
    Warum?
    und
    Wie kann ich das ändern?

    Danke


  • Mod

    code?



  • hier der code aufs minimum gekürzt:

    ...
    void threadFunc()
    {
        try
        {
            while( true )
            {
                foo(); //wirft einen string als exception
            }
        }
        catch( const char* s )
        {
            cerr << s << endl;
        }
        catch( ... )
        {
            cerr << "Unknown error" << endl;
        }
    }
    ...
    int main()
    {
        try
        {
            boost::thread thrd( threadFunc );
    
            while( true )
            {
                ...
            }
        }
        catch( const char* s )
        {
            cerr << "Main: " << s << endl; // "Main: " nur damit ich weiß wo die exception aufgefangen wird
        }
        catch( ... )
        {
            cerr << "Unknown error" << endl;
        }
    
        return 0;
    }
    ...
    

    Wie gesagt das ist nicht der orginalcode aber das zur problem verdeutlichung reicht es


  • Mod

    zeigt bei mir nicht dieses verhalten (d.h exception wird in threadFunc gefangen):. vielleicht solltest etwas näher auf die build-umgebung eingehen.



  • ich benutze dev-cpp also den mingw compiler



  • ich hab den fehler mal eingegrenzt und mir ist dabei aufgefallen das mein gekürzter code vielleicht doch etwas zu gekürzt war. ich bin mir da ber nicht sicher.

    ...
    Socket* SocketServer::Accept()
    {
        int addr_size = sizeof(sockaddr);
        SOCKET new_sock = accept(s_, &lastConnectionAddr_, &addr_size);
        if (new_sock == INVALID_SOCKET)
        {
            int rc = WSAGetLastError();
            if(rc==WSAEWOULDBLOCK)
            {
                return 0; // non-blocking call, no request pending
            }
            else
            {
                throw "Invalid Socket";
            }
        }
    
        //throw "Invalid Socket";
    
        Socket* r = new Socket(new_sock);
        return r;
    }
    ...
    void threadFunc()
    {
        try
        {
            SocketServer* acceptSocket( 80, 5 );
    
            while( true )
            {
                Socket* tmp = acceptSocket->Accept();
    
                ...
            }
        }
        catch( const char* s )
        {
            cerr << s << endl;
        }
        catch( ... )
        {
            cerr << "Unknown error" << endl;
        }
    }
    ...
    int main()
    {
        try
        {
            boost::thread thrd( threadFunc );
    
            while( true )
            {
                ...
            }
        }
        catch( const char* s )
        {
            cerr << "Main: " << s << endl; // "Main: " nur damit ich weiß wo die exception aufgefangen wird
        }
        catch( ... )
        {
            cerr << "Unknown error" << endl;
        }
    
        return 0;
    }
    ...
    

    Wenn ::accept() nun fehlschlägt wird der string "Invalid Socket" geworfen und vom catch block in der main funktion aufgefangen. komemntiere ich diesen aber aus und ent-kommentiere die zweite throw anweisung weiter unten in der funktion
    (was natürlich dazu führt das das system nicht mehr einwandfrei funktioniert, ist aber zum testen vernachlässigbar) dann kommt der string im catch block in der threadFunc funktion an...
    ich weiß nicht was ich davon halten soll aber der fehler nervt



  • Das Problem hatte ich auch mal, hab aber irgendwann aufgegeben und das empfehle ich dir auch!



  • Ob dieses Verhalten richtig oder falsch ist, kann ich dir nicht sagen. Die Frage ist wahrscheinlich auch zu speziell, als das sie hier jemand beantworten kann. Ich kann dir deshalb nur wämstens empfehlen, dich an die User-Mailingliste von Boost zu wenden. Da sind (logischwerweise) viel mehr Boost-User und vorallem Boost-Entwickler drin, die in solchen Fällen vielleicht eher eine Antwort haben.



  • Das war glaub ich irgendeine Linker-Option (oder wars Compiler)...
    Ich glaube die für Threads


Log in to reply