Как обнаружить взаимоблокировку с помощью библиотеки Asio?
-
21-08-2019 - |
Вопрос
у меня небольшая проблема с библиотекой boost:: asio.Мое приложение получает и обрабатывает данные асинхронно, оно создает потоки и запускает io_service.run() для каждого из них.
boost::asio::io_service io;
boost::thread_group thread_pool;
...
int cpu_cnt = get_cpu_count();
for (int i = 0; i < cpu_cnt; ++i)
{
thread_pool.create_thread( boost::bind(&run_service, &io) );
}
void run_service(boost::asio::io_service* io)
{
try
{
io->run();//make fun
}
catch(const std::exception& e)
{ //process error
}
catch(...)
{ //process error
}
}
Раз за разом мое приложение получает сообщение (через систему обмена сообщениями Windows) от какого-нибудь приложения-супервизора, которое проверяет, работает моя программа или нет.Если мое приложение не ответит, оно будет перезапущено.Самое сложное здесь - проверить, что потоки запущены, а не зашли в тупик.Я могу отправить обработчик в io_service следующим образом:
io.post( &reply_to_supervisor );
но этот метод влияет только на один поток.Как я могу проверить, что все потоки запущены и не зашли в тупик?
Решение
Возможно, я ошибаюсь, но решит ли использование io_service для каждого потока вашу проблему?
Еще одна идея:Публикация cpu_cnt
времена reply_to_supervisor
вызовы, которые используют немного sleep()
- нехорошо, но должно сработать
Другие советы
Это поражает меня как пример того, Проблема остановки, но поскольку вы, похоже, работаете в Windows, возможно, вы захотите взглянуть только на программное решение просто::поток библиотека.Это реализация библиотеки draft C ++ 0x threading library и имеет встроенное обнаружение взаимоблокировки в своих собственных мьютексах.
В конечном счете, хотя вам, вероятно, лучше задать этот вопрос на список рассылки asio.Автор библиотеки весьма полезен, и либо он, либо какой-либо другой заядлый пользователь asio может быть в состоянии предоставить лучший ответ там.
Я собираюсь предположить, что ваш io-> run() выполняет какой-то цикл для ожидания завершения asio.Я также собираюсь предположить, что у вас есть тайм-аут для этой операции asio.Грязный способ проверки - запустить поток состояния и проверить, что либо у потока asio истекло время ожидания завершения asio, либо что было опубликовано событие asio.В любом случае, вы бы установили какую-то переменную или дескриптор, чтобы знать, что ваш поток "живой" и зацикливается.Затем ваш поток состояния проверит, что каждая переменная / дескриптор и сбросит их после проверки.
Имейте в виду, я уверен, что есть и другие способы, но это то, что пришло на ум прямо сейчас...=)