J'ai un petit problème avec la librairie boost :: asio. Mon application reçoit et traite les données de manière asynchrone, crée des threads et exécute io_service.run() sur chacune d'elles.Comment détecter un blocage avec la bibliothèque 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
}
}
Maintes fois, mon application reçoit un message (à travers les fenêtres du système de messagerie) depuis une application de supervision qui vérifie mon programme est vivant ou non. Si mon application ne répond pas, elle sera redémarrée. La partie délicate ici est de vérifier que les threads sont en cours d'exécution et ne sont pas bloqués. Je peux publier le gestionnaire sur io_service comme ceci:
io.post(&reply_to_supervisor);
mais cette méthode n'affecte qu'un seul thread. Comment puis-je vérifier que tous les threads sont en cours d'exécution et ne sont pas bloqués?
Livelock serait tout aussi mauvais, non? – MSalters