0

私は自分のアプリケーションでこの問題に苦労していたので、簡単なコード スニペットで問題を再現しようとしました。

Boost 1.44 と mingw32-g++ バージョン 4.4.1 を使用しています。Windows XP の場合

次のプログラムの期待される結果は次のとおりです。

>messageservice.exe

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

しかし、実際にはこれを行うこともあれば、「未処理の win32 例外...」(Just In Time デバッガーを使用) と詳細にクラッシュすることもあり、サイレントにクラッシュすることもあります。

だから私はなぜこれを行うのか途方に暮れています。

try...catch ブロックを削除すると、プログラムは問題なく実行されます。

コードは次のとおりです。

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

非メインスレッドで io_service インスタンスを管理することは違法ですか? または、私は盲目的に明らかに間違ったことをしましたか!?

どんな助けにも感謝します!

ありがとう

4

1 に答える 1

1

解決策を提供してくれた Matt Gruenke に感謝します (http://news.gmane.org/gmane.comp.lib.boost.asio.user)。

どうやらスレッドセーフな例外を持つことは、mingw のオプションの追加機能です。リンク時に -mthreads オプションを指定する必要がありました

私は、これが常時オンのコア保証であるべきだと考えるのはナイーブだと思います!

于 2010-11-29T18:31:23.360 に答える