在另一个线程中管理io_service,异常的奇怪问题

时间:2010-11-29 15:42:38

标签: c++ boost-asio boost-thread

在我的应用程序中,我一直在努力解决这个问题,所以我试图在一个简单的代码片段中重现这个问题。

我正在使用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实例是非法的吗?或者我做了一些明显错误的事情!?

感谢任何帮助!

由于

1 个答案:

答案 0 :(得分:1)

感谢Matt Gruenke提供的解决方案(http://news.gmane.org/gmane.comp.lib.boost.asio.user)

在mingw中,显然有线程安全异常是一个可选的附加功能。我需要在链接时指定-mthreads选项

我想我很天真地认为这应该是永远在线的核心保证!