Как обнаружить взаимоблокировку с помощью библиотеки Asio?

StackOverflow https://stackoverflow.com/questions/355958

  •  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.В любом случае, вы бы установили какую-то переменную или дескриптор, чтобы знать, что ваш поток "живой" и зацикливается.Затем ваш поток состояния проверит, что каждая переменная / дескриптор и сбросит их после проверки.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top