2008-12-10 1 views
1

У меня мало проблем с boost :: asio library. Мое приложение получает и обрабатывает данные асинхронно, создает потоки и запускает io_service.run() для каждого из них.Как обнаружить тупик с библиотекой Asio?

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); 

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

ответ

2

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

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

0

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

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

1

Это поражает меня как экземпляр Halting Problem, но так как вы, кажется, быть в Windows, вы можете посмотреть библиотеку Just Software Solution just::thread. Это реализация проектной библиотеки потоков C++ 0x и имеет встроенное обнаружение взаимоблокировки в своих собственных мьютексах.

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

+1

бы динамический тупик так же плохо, верно? – MSalters 2009-01-05 15:49:01