wake-up-neo.net

Portable Methode zum Festlegen der Priorität von std :: thread in C ++ 11

Was ist der richtige Weg in der Post-C++ 11-Welt, um die Priorität einer Instanz von std :: thread festzulegen?

Gibt es eine tragbare Methode, die zumindest in Windows- und POSIX-Umgebungen (Linux) funktioniert?

Oder geht es darum, einen Griff zu bekommen und die systemeigenen Aufrufe zu verwenden, die für das jeweilige Betriebssystem verfügbar sind?

43
Gerdiner

Es gibt keine Möglichkeit, Thread-Prioritäten über die C++ 11-Bibliothek festzulegen. Ich glaube nicht, dass sich dies in C++ 14 ändern wird, und meine Kristallkugel ist zu trüb, um Versionen danach zu kommentieren.

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

Ich kenne die entsprechende Windows-Funktion nicht, bin mir aber sicher, dass es eine geben muss.

48
Mike Seymour

Meine schnelle Umsetzung ...

#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;
};

und so benutze ich es ...

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

// set scheduling of created thread
thread::setScheduling(example_thread, SCHED_RR, 2);
22
marc

Die Standard-C++ - Bibliothek definiert keinen Zugriff auf Thread-Prioritäten. Um Thread-Attribute festzulegen, verwenden Sie die native_handle() des std::thread Und verwenden sie z. B. auf einem POSIX-System mit pthread_getschedparam() oder pthread_setschedparam() . Ich weiß nicht, ob es Vorschläge zum Hinzufügen von Planungsattributen zur Thread-Schnittstelle gibt.

10
Dietmar Kühl

In Windows werden Prozesse nach Klassen- und Ebenenpriorität organisiert. Lesen Sie dies: Scheduling Priorities , es gibt ein gutes Gesamtwissen über Thread- und Prozesspriorität. Mit folgenden Funktionen können Sie die Prioritäten auch dynamisch steuern: GetPriorityClass () , SetPriorityClass () , SetThreadPriority () , GetThreadPriority () .

Anscheinend können Sie auch die native_handle() von std::thread Mit pthread_getschedparam() oder pthread_setschedparam() auf einem Windows-System verwenden. Überprüfen Sie dieses Beispiel std :: thread: Native Handle und achten Sie auf die hinzugefügten Header!

5
Rodrigo Rutsatz