io_service在破坏时挂起

时间:2015-09-14 13:47:08

标签: c++ c++11 boost-asio

我使用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无法加入。

1 个答案:

答案 0 :(得分:2)

请勿致电_ioWork.release()(或致电release后,删除您获得的指针)。

以下是文档中有关release的内容:

  

释放托管对象的所有权(如果有)。 get()在调用后返回nullptr。

在您的代码中,您的_ioWork对象被泄露;这可能是你ioService挂起的原因。