Dans l'exemple suivant j'utilise boost ASIO, ici un thread est prêt et attend toujours un travail à faire.Il va toujours faire des jobs linéairement (comme si les jobs sont stockés dans un file d'attente que je comprends) L'extrait de code suivant explique mon point.Utilise un IO_Service déjà créé thread plus efficace
void WorkerThread(boost::shared_ptr<boost::asio::io_service> io_service)
{
io_service->run();
}
void PrintNum(int x)
{
//Do somejon
}
boost::shared_ptr<boost::asio::io_service> io_service(new boost::asio::io_service);
boost::shared_ptr<boost::asio::io_service::work> work(new boost::asio::io_service::work(*io_service));
boost::asio::io_service::strand strand(*io_service);
worker_threads.create_thread(boost::bind(&WorkerThread, io_service));
//Give the thread (which is already active) some work to do
for(int i=0;i<2;i++)
{
strand.post(boost::bind(&PrintNum, i));
}
Question 1
Maintenant, ma question est de savoir si la méthode ci-dessus est plus rapide et plus efficace que le lancement de thread indépendants (par exemple en utilisant boost::thread
) Je sais que dans le cas de threads indépendants tels que par boost::thread
le lancement des threads peut ne pas être linéaire (le thread 2 pourrait s'exécuter avant le thread 1) ma question est au cas où il n'y aurait qu'un thread impliqué quel mécanisme aurait été plus rapide? Y at-il en tête becaus eof boost :: bind
Question 2 Dans l'exemple ci-dessus 2 fils sont lancés qui attendent pour le travail (thread1 et thread2). Maintenant, je voulais savoir ce qui se passe exactement quand le travail est 2 consécutivement donné en tant que telle
for(int i=0;i<2;i++)
{
strand.post(boost::bind(&PrintNum, i));
}
Chaque thread obtient un emploi fil cependant 2 wont complet avant fil 1. Mes questions sont ce qui se passe avec le fil 2 pendant que le fil de discussion est lancé même s'il entre dans la méthode PrintNum
tandis que le fil 1 est lancé. Quel est le point d'avoir plus d'un fil alors dans un tel cas quand il s'agit de la performance?