1

我基本上是基于 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));

现在,由于此代码在库中的构造函数中运行,因此引发了段错误,我不知道为什么。如果我将其替换为:

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

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

干杯

4

1 回答 1

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);
于 2013-04-08T16:11:46.480 回答