Как обнаружить тупик с библиотекой Asio? - PullRequest
1 голос
/ 10 декабря 2008

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

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

Ответы [ 3 ]

2 голосов
/ 06 января 2009

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

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

1 голос
/ 05 января 2009

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

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

0 голосов
/ 10 декабря 2008

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

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

...