我使用boost::asio::io_service
来处理Foo
中的工作。现在这个工作正常,直到我退出~Foo
并挂起io_service
析构函数(在service_registry的析构函数中)。
我做错了吗?
struct Foo {
Foo();
~Foo();
void bar();
boost::asio::io_service _ioService;
unique_ptr<boost::asio::io_service::work> _ioWork;
thread _thread;
};
Foo::Foo() :
_ioWork( new boost::asio::io_service::work(_ioService) ),
_thread([&]() {
_ioService.run();
}) {
}
Foo::~Foo() {
_ioWork.release();
_ioService.stop();
_thread.join();
// works great till here
}
void
Foo::bar() {
auto writer = []()
{
// Some magic code
};
_ioService.post( writer );
}
我有点怀疑,当我_thread
上没有致电stop
时,为什么_ioService
无法加入。
答案 0 :(得分:2)
请勿致电_ioWork.release()
(或致电release
后,删除您获得的指针)。
以下是文档中有关release
的内容:
释放托管对象的所有权(如果有)。 get()在调用后返回nullptr。
在您的代码中,您的_ioWork
对象被泄露;这可能是你ioService
挂起的原因。