Я запускаю некоторые тесты, которым требуется асинхронная связь, а базовой структурой является 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()
?).
РЕДАКТИРОВАТЬ: добавьте код оболочки io_service
, поскольку он кажется уместным в соответствии с комментариями.