2008-12-10 11 views
1

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?

Répondre

2

Je peux me tromper, mais l'utilisation d'un io_service par thread résoudrait-elle votre problème?

Une autre idée: poster cpu_cnt fois reply_to_supervisor appels qui utilisent un peu sleep() - pas agréable, mais devrait travailler

0

Je vais supposer que votre io-> run() fait une sorte de boucle pour attendre la fin de l'asio. Je vais aussi supposer que vous avez un délai d'attente sur cette opération asio. Une manière de vérifier est d'exécuter un thread de statut et de vérifier que le thread asio a expiré en attendant que l'asio soit terminé ou qu'un événement asio ait été posté. De toute façon, vous devez définir une sorte de variable ou gérer pour savoir que votre thread est "vivant" et en boucle. Votre thread de statut vérifiera alors chaque variable/handle et les réinitialisera après vérification.

Rappelez-vous, je suis sûr qu'il ya d'autres façons, mais c'est ce qui vient à l'esprit au moment ... =)

1

Cela me frappe comme une instance de la Halting Problem, mais puisque vous semblez soyez sur Windows, vous voudrez peut-être regarder la bibliothèque just::thread de Just Software Solution. Il s'agit d'une implémentation de la bibliothèque de threads de projet C++ 0x et de la détection d'interblocage intégrée dans ses propres mutex.

En fin de compte, vous devriez probablement poser cette question asio mailing list. L'auteur de la bibliothèque est très utile, et lui ou un autre utilisateur d'Asio hardcore peut être en mesure de fournir une meilleure réponse là-bas.

+1

Livelock serait tout aussi mauvais, non? – MSalters