pool de threads boost :: asio io_service

Quelle est l’utilisation appropriée des parameters d’un pool de threads pour io_service? Ces 2 déclarations de la documentation me jettent à la poubelle:

io_service :: run

Une sortie normale de la fonction run () implique que l’object io_service est arrêté (la fonction arrêtée () renvoie true). Les appels suivants à run (), run_one (), poll () ou poll_one () seront immédiatement renvoyés, sauf en cas d’appel préalable à reset ().

io_service :: reset

Cette fonction doit être appelée avant tout second ou dernier ensemble d’invocations des fonctions run (), run_one (), poll () ou poll_one () lorsqu’un appel précédent de ces fonctions est renvoyé en raison de l’arrêt ou de l’épuisement du service io_service. travail.

Voici ce que je fais actuellement:

boost::thread_group m_Threads; boost::asio::io_service m_IoService; boost::barrier m_Barrier(numThreads); for( unsigned int i = 0; i < numThreads; ++i ) { m_Threads.create_thread( [&]() { for(;;) { m_IoService.run(); if( m_Barrier.wait() ) // will only return true for 1 thread { m_IoService.reset(); } m_Barrier.wait(); } }); } m_IoService.stop(); m_Threads.interrupt_all(); m_Threads.join_all(); 

Tout semble bien fonctionner si je mets simplement m_IoService.run() dans une boucle infinie (ce que la documentation semble indiquer ne devrait pas être le cas). Quelle est la bonne façon?

run() est un appel bloquant et exécutera tous les événements possibles avant de revenir. Il ne reviendra que s’il n’y a plus d’événements à gérer. Une fois renvoyé, vous devez appeler reset() sur le serveur io avant d’appeler run() nouveau.

Vous pouvez avoir plusieurs threads appelant run() – ce n’est pas un problème, et vous n’avez pas besoin de la boucle infinie tant que io_service a du travail à faire. Le modèle normal consiste à créer un object de work sur le serveur io qui forcera run() à ne jamais revenir. Cela signifie que vous devez explicitement appeler stop() sur le service io_service lorsque vous avez terminé, car il ne se terminera jamais naturellement.

Si vous configurez un work sur le service io_service, celui-ci ne se fermera jamais naturellement et vous n’aurez donc jamais besoin d’appeler reset() .

 work some_work(m_IoService); // this will keep the io_service live. for( unsigned int i = 0; i < numThreads; ++i ) { m_Threads.create_thread( [&]() { m_IoService.run(); }); } 

Maintenant, tous les threads dissortingbuent des événements sur le io_service

 // Now post your jobs m_IoService.post(boost::bind(...)); // this will be executed in one of the threads m_IoService.post(boost::bind(...)); // this will be executed in one of the threads m_IoService.post(boost::bind(...)); // this will be executed in one of the threads m_IoService.stop(); // explicitly stop the io_service // now join all the threads and wait for them to exit