Quelle est la bonne façon dans le monde post C++ 11 pour définir la priorité d'une instance de std :: thread
Existe-t-il un moyen portable de le faire qui fonctionne au moins dans les environnements Windows et POSIX (Linux)?
Ou s'agit-il d'obtenir une poignée et d'utiliser les appels natifs disponibles pour le système d'exploitation particulier?
Il n'y a aucun moyen de définir les priorités des threads via la bibliothèque C++ 11. Je ne pense pas que cela va changer en C++ 14, et ma boule de cristal est trop floue pour commenter les versions après cela.
Dans POSIX, pthread_setschedparam(thread.native_handle(), policy, {priority});
Je ne connais pas la fonction équivalente de Windows, mais je suis sûr qu'il doit y en avoir une.
Ma mise en œuvre rapide ...
#include <thread>
#include <pthread.h>
#include <iostream>
#include <cstring>
class thread : public std::thread
{
public:
thread() {}
static void setScheduling(std::thread &th, int policy, int priority) {
sch_params.sched_priority = priority;
if(pthread_setschedparam(th.native_handle(), policy, &sch_params)) {
std::cerr << "Failed to set Thread scheduling : " << std::strerror(errno) << std::endl;
}
}
private:
sched_param sch_params;
};
et c'est comme ça que je l'utilise ...
// create thread
std::thread example_thread(example_function);
// set scheduling of created thread
thread::setScheduling(example_thread, SCHED_RR, 2);
La bibliothèque C++ standard ne définit aucun accès aux priorités des threads. Pour définir les attributs de thread, vous utiliserez le std::thread
Du native_handle()
et vous l'utiliserez, par exemple, sur un système POSIX avec pthread_getschedparam()
ou pthread_setschedparam()
. Je ne sais pas s'il existe des propositions pour ajouter des attributs de planification à l'interface de thread.
Sous Windows, les processus sont organisés en classe et niveau de priorité. Lisez ceci: Ordonnancement des priorités , il donne une bonne connaissance globale de la priorité des threads et des processus. Vous pouvez utiliser les fonctions suivantes pour contrôler les priorités même de manière dynamique: GetPriorityClass () , SetPriorityClass () , SetThreadPriority () , GetThreadPriority () .
En apparence, vous pouvez également utiliser native_handle()
de std::thread
Avec pthread_getschedparam()
ou pthread_setschedparam()
sur un système Windows. Vérifiez cet exemple, std :: thread: Native Handle et faites attention aux en-têtes ajoutés!