2013-04-08 139 views
1

我基本上是在ASIO文档中基于序列化示例构建一个共享库,我的意思是我正在编译-shared和-fpic选项来生成一个.so文件,其中包括钩/包装。Boost ASIO共享库问题

我对另一个进程运行共享库,然后我的代码通过库中的构造函数(如Windows上的DLLMain)运行。

我知道我的代码正在执行,它运行良好,直到某个点。基本上我的问题涉及到试图把ASIO和我的网络代码放到另一个线程上。我使用下面的代码来做到这一点:

asio::io_service io_service; 
server server(io_service, port); 
asio::thread t(boost::bind(&asio::io_service::run, &io_service)); 

现在,这个代码库中的一个构造函数中运行,是抛出一个赛格故障,我想不通为什么。如果我将其替换为:

asio::io_service io_service; 
server server(io_service, port); 
io_service.run(); 

代码运行100%的罚款,但它窃取执行的整个主题和挂钩过程将无法运行。有人可以帮我从这里出去吗?我很困惑。

干杯

+0

我怀疑,它的东西到对象的生命周期有关。您是否在asio :: thread语句之后使用t.join()? – Icarus3 2013-04-08 15:11:58

回答

1

看起来像是一生的问题。

如果下面的代码是在库中的函数:

void some_function() 
{ 
    asio::io_service io_service; 
    server server(io_service, port); 
    asio::thread t(boost::bind(&asio::io_service::run, &io_service)); 
} 

然后当函数返回时,io_service会走出去的范围,被破坏而新产生的线程试图处理事件循环。考虑改变它,这样的io_serviceserver寿命至少延伸到了线的持续时间:

void server_run() 
{ 
    asio::io_service io_service; 
    server server(io_service, port); 
    io_service.run(); 
} 

... 

asio::thread t(&server_run);