提升ASIO共享库的麻烦

时间:2013-04-08 04:09:11

标签: multithreading gcc boost boost-asio shared

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

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

我知道我的代码正在被执行,并且它运行良好直到某一点。基本上我的问题涉及尝试将ASIO和我的网络代码放到另一个线程上。我正在使用以下代码来执行此操作:

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

现在,由于此代码在库中的构造函数中运行,因此抛出了一个seg错误,我无法弄清楚原因。如果我将其替换为:

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

代码运行100%正常,除了它窃取整个执行线程,并且钩子进程根本不会运行。有人可以帮我从这里出去吗?我真的很困惑。

干杯

1 个答案:

答案 0 :(得分: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);