Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Boost ASIO共享库问题_Multithreading_Gcc_Boost_Boost Asio_Shared - Fatal编程技术网

Multithreading Boost ASIO共享库问题

Multithreading Boost ASIO共享库问题,multithreading,gcc,boost,boost-asio,shared,Multithreading,Gcc,Boost,Boost Asio,Shared,我基本上是基于ASIO文档中的序列化示例构建一个共享库,我的意思是使用-shared和-fpic选项编译生成一个.so文件,其中包括hook/wrappers 我正在对另一个进程运行我的共享库,然后我的代码通过库中的构造函数运行(如Windows上的DLLMain) 我知道我的代码正在执行,并且在某一点之前运行良好。基本上,我的问题是试图将ASIO和我的网络代码放到另一个线程上。我使用以下代码来实现这一点: asio::io_service io_service; server server(i

我基本上是基于ASIO文档中的序列化示例构建一个共享库,我的意思是使用-shared和-fpic选项编译生成一个.so文件,其中包括hook/wrappers

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

我知道我的代码正在执行,并且在某一点之前运行良好。基本上,我的问题是试图将ASIO和我的网络代码放到另一个线程上。我使用以下代码来实现这一点:

asio::io_service io_service;
server server(io_service, port);
asio::thread t(boost::bind(&asio::io_service::run, &io_service));
现在,由于这段代码在库中的构造函数中运行,is抛出了一个seg错误,我不知道为什么。如果我将其替换为:

asio::io_service io_service;
server server(io_service, port);
io_service.run();
代码运行100%正常,只是它窃取了整个执行线程,钩住的进程根本不会运行。有人能帮我吗?我真的很困惑


干杯

这似乎是一个终生的问题

如果库中的函数中包含以下代码:

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\u服务将超出范围,在新生成的线程尝试处理事件循环时被销毁。考虑更改它,使<>代码> IoService < /C> >和 Server < /C> >至少延伸到线程的持续时间:

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

...

asio::thread t(&server_run);

这似乎是一个终生的问题

如果库中的函数中包含以下代码:

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\u服务将超出范围,在新生成的线程尝试处理事件循环时被销毁。考虑更改它,使<>代码> IoService < /C> >和 Server < /C> >至少延伸到线程的持续时间:

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

...

asio::thread t(&server_run);

我怀疑,这与对象生命周期有关。是否在asio::thread语句之后使用t.join()?我怀疑,这与对象生命周期有关。是否在asio::thread语句之后使用t.join()?