Как обнаружить тупик с библиотекой Asio?

У меня есть небольшие проблемы с библиотекой 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 );

но этот метод влияет только на один поток. Как я могу проверить, что все потоки работают и не заблокированы?

10.12.2008 12:58:50
3 ОТВЕТА
РЕШЕНИЕ

Я могу ошибаться, но решит ли ваша проблема использование io_service для каждого потока?

Еще одна идея: разместить cpu_cntраз reply_to_supervisorзвонки , которые используют немного sleep()- не хорошо, но должен работать

2
6.01.2009 14:51:12

Я собираюсь предположить, что ваш io-> run () выполняет какой-то цикл для ожидания завершения asio. Я также собираюсь предположить, что у вас есть тайм-аут на эту операцию asio. Грязный способ проверить - запустить поток состояния и проверить, истекло ли время потока asio в ожидании завершения asio, или что событие asio было опубликовано. В любом случае, вы должны установить какую-то переменную или дескриптор, чтобы знать, что ваш поток «жив» и находится в цикле. Ваша ветка состояния затем проверит каждую переменную / обработчик и сбросит их после проверки.

Имейте в виду, я уверен, что есть другие пути, но это то, что пришло на ум прямо сейчас ... =)

0
10.12.2008 17:23:19

Это выглядит как пример проблемы остановки , но так как вы, похоже, работаете в Windows, вы можете захотеть взглянуть на библиотеку Just :: Solution Just :: Thread . Это реализация черновой библиотеки потоков C ++ 0x со встроенным обнаружением взаимоблокировок в собственных мьютексах.

В конце концов, хотя вам, вероятно, лучше задать этот вопрос в списке рассылки asio . Автор библиотеки весьма полезен, и либо он, либо какой-либо другой хардкорный пользователь asio может дать лучший ответ.

1
5.01.2009 15:38:41