io_service :: run () не завершается после перехода на повышение 1.72 - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть приложение, выполняющее много работы в io_service :: run (). Множество клиент-серверных tcp-соединений, таймеров, вызовов post () и т. Д. c. Я работал нормально с Boost 1.66 / ASIO. После переключения на boost 1.72 run () больше не завершает работу после обработки всех рабочих элементов. В качестве обходного пути я поддерживаю количество выдающихся рабочих элементов и настраиваю таймер. Как только это число достигает 0, обработчик таймера вызывает io_service :: stop () для завершения run (). До переключения на буст 1.72 работал без этого.

Есть ли способ узнать, что приводит к зависанию метода run (). Интересно, знает ли кто-нибудь о каких-либо изменениях между бустом 1.66 и 1.72, которые могли бы вызвать такое изменение поведения.

Я пытался использовать BOOST_ASIO_ENABLE_HANDLER_TRACKING, но это не помогло. Когда вся работа завершена, отладочный вывод, сгенерированный Handler Tracker, останавливается, и все элементы кажутся завершенными, а run () продолжает зависать ().

Я не могу воспроизвести это на простом примере любого приемлемого размера , Даже с приложением оно иногда завершается, как и ожидалось. Приложение является однопоточным и синхронно вызывает run () в главном потоке.

...