代码之家  ›  专栏  ›  技术社区  ›  Ender

如何取消线程中的IO\U服务对象?

  •  0
  • Ender  · 技术社区  · 6 年前

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

    如何使用lambda取消标准线程中的io_服务对象?

    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.
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   sehe    6 年前

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

    如果失败了我会回到 IO U服务::停止 .

    其次, io_service 是少数被记录为线程安全的ASIO对象之一(除了构造/销毁)。所以你可以打电话 IO U服务::停止 从任何地方,只要你能确定对象是活的(没有被破坏)。