Как отменить объект io_service в потоке? - PullRequest
0 голосов
/ 13 февраля 2019

Насколько я понимаю, чтобы завершить этот поток таймера, мне нужно вызвать stop () для объекта io_service.Я делаю это так, чтобы объект MyClass (также работающий как поток) не заканчивался активным исключением, когда завершается его поток.

Как отменить объект 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.

}

1 Ответ

0 голосов
/ 13 февраля 2019

Прежде всего, я бы не стал звонить io_service::stop.Вместо этого я бы отменил все ожидающие работы и подождал, пока служба изящно вернется.

Только в случае неудачи я вернусь к io_service::stop.

Во-вторых, io_service - этоодин из немногих объектов Asio, который задокументирован как поточно-ориентированный (кроме строительства / разрушения).Таким образом, вы можете просто позвонить io_service::stop из любого места, при условии, что вы уверены, что объект жив (не разрушен).

...