Méthode Portable de paramétrage de std:: priorité de thread en C++11

Quelle est la bonne façon dans le monde post C++11 de définir la priorité d'une instance de std:: thread

Existe-t-il une façon portable de faire cela qui fonctionne au moins dans les environnements Windows et POSIX (Linux)?

Ou est-ce une question d'obtenir une poignée et en utilisant tous les appels natifs sont disponibles pour l'OS?

36
demandé sur Gerdiner 2013-09-19 04:33:48

4 réponses

Il n'y a aucun moyen de définir les priorités du thread 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 postérieures.

in POSIX,pthread_setschedparam(thread.native_handle(), policy, {priority});

Je ne connais pas la fonction Windows équivalente, mais je suis sûr qu'il doit y en avoir une.

43
répondu Mike Seymour 2016-12-20 12:34:27

ma mise en oeuvre 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) {
        sched_param sch_params;
        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 de cette façon que je l'utilise...

// create thread
std::thread example_thread(example_function);

// set scheduling of created thread
thread::setScheduling(example_thread, SCHED_RR, 2);
16
répondu marc 2015-07-27 11:49:01

la bibliothèque standard C++ ne définit aucun accès aux priorités du thread. Pour définir les attributs de thread, vous utilisez le std::threadnative_handle() et de l'utiliser, par exemple, sur un système POSIX pthread_getschedparam() ou pthread_setschedparam(). Je ne sais pas s'il y a des propositions pour ajouter des attributs de planification à l'interface thread.

8
répondu Dietmar Kühl 2013-09-19 01:38:38

dans Windows les processus sont organisés en priorité de classe et de niveau. Lire ceci: Planification Des Priorités, il donne une bonne connaissance globale sur le fil et la priorité de processus. Vous pouvez utiliser les fonctions suivantes pour contrôler les priorités, même de manière dynamique:GetPriorityClass (),SetPriorityClass (),SetThreadPriority (), GetThreadPriority ().

Apperantly vous pouvez également utiliser std::threadnative_handle() 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!

4
répondu Rodrigo Rutsatz 2014-11-10 16:20:57