Отмена таймера ASIO и вопрос жизненного цикла - PullRequest
0 голосов
/ 17 мая 2019

После прочтения этих данных ...

Безопасное отключение таймера крайнего срока boost asio

Атомная отмена асинхронного таймера asio из другого потока

... Я хотел бы попытаться получить разъяснение по поводу аспекта использования.

В соответствии с первым заданным вопросом, отмена таймера после истечения срока его действия, но до запуска его обработчика не работает,Обработчик для такого «таймера в полете» по-прежнему работает нормально.

Это поднимает вопрос жизненного цикла ... Обычная схема использования - таймер, являющийся членом класса, и срок его действия.обработчик для ссылки на этот родительский класс.Родительский класс может отменить таймер от своего деструктора, но в сценарии, приведенном выше, может показаться, что он столкнулся с ошибкой, поскольку и таймер, и родительский класс больше не существуют при запуске обработчика.

Если это действительнослучай, как это можно решить?Мы можем перехватить std :: weak_ptr в родительском классе в обработчике и проверить его перед продолжением, но не каждому родительскому классу можно управлять его жизненным циклом через std :: shared_ptr.

1 Ответ

0 голосов
/ 18 мая 2019

Ниже приведены мои наблюдения, основанные на Net.ts, но не на ASIO - я считаю, что между ними не произойдет никаких фундаментальных изменений.

, когда мы отменим таймер - независимо от его срока действия, егообработчики или pending_waiter будут работать, и, похоже, все они работают с их error_code, установленным на

op->ec_ = std::experimental::net::v1::error::operation_aborted;

Итак, насколько я понимаю, ваш второй вопрос: что если у меня есть объект таймера внутрикласс, и по некоторым причинам деструктор объекта принадлежит этому классу, запускает и отменяет таймер (?)

В асинхронном программировании (в частности, тот, который был установлен с использованием обратных вызовов), аргумент error_code, который получаетпереданный вашему обработчику играет главную роль.

Итак, в вашем сценарии, я полагаю, вы могли бы преодолеть предполагаемое «столкновение при столкновении», используя

if(ec == std::experimental::net::v1::error::operation_aborted)
     LOG(....) or return;

Редактировать: если ваш запрос какМожем ли мы управлять жизненным циклом объекта, тогда я могу сказать, что есть несколько способов сделать это, но момент, который я хочу донести через мое замечание, - это объект таймера всякий раз, когда отменяетсяlled, он сообщает вам через ec, что он был отменен, и на основании этого решает ваш следующий ход.

...