web-dev-qa-db-fra.com

Méthode portable de définition de la priorité std :: thread en C ++ 11

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?

43
Gerdiner

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.

48
Mike Seymour

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);
22
marc

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.

10
Dietmar Kühl

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!

5
Rodrigo Rutsatz