首页 > 解决方案 > 如何取消线程中的 io_service 对象?

问题描述

我的理解是,要结束这个计时器线程,我需要在 io_service 对象上调用 stop() 。我这样做是为了让 MyClass 对象(也作为线程运行)在线程结束时不会以活动异常结束。

如何使用 lambda 在标准线程中取消 io_service 对象?

class MyClass
{
    private:
        boost::asio::io_service io;

    // ...
}

void MyClass::operator()()
{
    boost::asio::deadline_timer my_timer(io,
        boost::posix_time::seconds(300));

    my_timer.async_wait(boost::bind(&MyTest::pump, this,
        boost::asio::placeholders::error, &my_timer));

    std::unique_ptr<std::thread> io_thread(
        std::make_unique<std::thread>([&] { io.run(); }));


    // ...

    // cancel here.

}

标签: multithreadingc++11boost-asio

解决方案


首先,我通常不会打电话io_service::stop。相反,我会取消所有待处理的工作并等待服务正常返回。

只有失败了,我才会退回到io_service::stop.

其次,它io_service是少数被记录为线程安全的 Asio 对象之一(构造/破坏除外)。所以你可以io_service::stop从任何地方调用,只要你能确定对象是活着的(没有被破坏)。


推荐阅读