Как обнаружить взаимоблокировку с библиотекой 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 );

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


person Evgeny Lazin    schedule 10.12.2008    source источник


Ответы (3)


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

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

person Vlagged    schedule 06.01.2009

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

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

person Bklyn    schedule 05.01.2009

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

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

person PiNoYBoY82    schedule 10.12.2008