Подтвердить что ты не робот

Удалите все обработчики из boost:: asio:: io_service, не называя их

Я хочу удалить все обработчики из службы IO_service, прежде чем снова его использовать. Возможно ли это?

Я пишу модульные тесты, содержащие asio::io_service. Между каждым тестовым случаем я хочу очистить обработчики от глобального io_service. Я думал, что io_service::reset будет с этим, но это не так. reset() позволяет возобновить io_service. Все обработчики из последнего тестового примера все еще находятся в очереди.

Мне нужно только это сделать для модульного тестирования, чтобы любой сумасшедший хак работал.


Дополнительная информация:

io_service - это переменная-член deadline_timer. deadline_timer является частью кода, который я тестирую, поэтому я не могу изменить его построение. Я получаю его io_service с помощью метода deadline_timer get_io_service.

4b9b3361

Ответ 1

Что ж, я несколько секунд ломал голову над этим и придумал подходящее решение. Это мать всех хаков.

void clear( boost::asio::io_service& service )
{
    service.stop();
    service.~io_service();
    new( &service ) boost::asio::io_service;
}

Я не уверен, насколько это безопасно для производственного кода. Но пока это работает (не segfaults, не странное поведение).