Я запускаю несколько тестов, которые требуют асинхронного взаимодействия, и базовая структура - Asio.Иногда обработчик сохраняется в цикле обработки, даже если тест был прерван по уважительным причинам.Но затем он называется после цели удалены.
Класс Test
:
virtual void SetUp()
{
_client = new Client;
_server = new Server;
Service::run();
}
virtual void TearDown()
{
Service::stop();
delete _client;
delete _server;
}
Класс Service
:
static void run()
{
_thread = new asio::thread(boost::bind(&asio::io_service::run, _service));
}
static void stop()
{
_service->stop();
_thread->join();
delete _thread;
_service->reset();
}
io_service::stop()
не блокирует, поэтому в моем случае он становится совершенно бесполезным.Если я удаляю объект io_service
в конце функции, обработчик вызываться не будет, но я бы хотел получить лучшее решение для принудительного завершения до удаления объектов.
Примечание: фактический цикл обработки выполняется во втором потоке, но он объединен в оболочку io_service::stop()
, и вся проблема, похоже, не связана с потоками.
Я используюAsio (не Boost) 1.4.5, но может рассмотреть вопрос об обновлении (чтобы получить операцию io_service::stopped()
?).
EDIT: добавить код оболочки io_service
, который, как представляется, уместен согласно комментариям.