Das ist die grundlegende Vorlage für, wie ich es tun würde, aber nach der Suche habe ich fast keine Code Beispiele gefunden, so denke ich, das Urteil ist aus, ob es das Beste ist oder nicht.
Das Problem ist, dass boost :: thread keinen Konstruktor hat, der das Übergeben von Pthead-Attributen bei der Erstellung von Threads erlaubt, so dass Sie nach dem Start des Threads Änderungen vornehmen müssen. Der einzige andere Weg, den ich kenne, ist die Vererbung von Prozessen/Threads. Sofern nicht anders angegeben, erben neue Threads den Zeitplan/die Priorität ihres Erstellers, sodass Sie den aktuellen Thread ändern können, bevor Sie Worker-Threads erstellen, und dann bei Bedarf zurückwechseln können. Scheint umständlich, aber es ist eine Alternative.
Hier ist ein Hack ein Beispiel, das hoffentlich beide demostrates. Gegebenenfalls müssen Sie die Richtlinie und die Priorität ändern und als root ausführen.
Vorsicht Sie die Priorität, mit der Art und Weise eingestellt. Es gelten verschiedene Einschränkungen.
#include <iostream>
#include <boost/thread/thread.hpp>
#include <unistd.h>
#include <sched.h>
#include <cstdio>
void* threadfunc()
{
sleep(5);
}
void displayAndChange(boost::thread& daThread)
{
int retcode;
int policy;
pthread_t threadID = (pthread_t) daThread.native_handle();
struct sched_param param;
if ((retcode = pthread_getschedparam(threadID, &policy, ¶m)) != 0)
{
errno = retcode;
perror("pthread_getschedparam");
exit(EXIT_FAILURE);
}
std::cout << "INHERITED: ";
std::cout << "policy=" << ((policy == SCHED_FIFO) ? "SCHED_FIFO" :
(policy == SCHED_RR) ? "SCHED_RR" :
(policy == SCHED_OTHER) ? "SCHED_OTHER" :
"???")
<< ", priority=" << param.sched_priority << std::endl;
policy = SCHED_FIFO;
param.sched_priority = 4;
if ((retcode = pthread_setschedparam(threadID, policy, ¶m)) != 0)
{
errno = retcode;
perror("pthread_setschedparam");
exit(EXIT_FAILURE);
}
std::cout << " CHANGED: ";
std::cout << "policy=" << ((policy == SCHED_FIFO) ? "SCHED_FIFO" :
(policy == SCHED_RR) ? "SCHED_RR" :
(policy == SCHED_OTHER) ? "SCHED_OTHER" :
"???")
<< ", priority=" << param.sched_priority << std::endl;
}
int main(int argc, char* argv[])
{
int policy, res;
struct sched_param param;
if ((policy = sched_getscheduler(getpid())) == -1)
{
perror("sched_getscheduler");
exit(EXIT_FAILURE);
}
if ((res = sched_getparam(getpid(), ¶m)) == -1)
{
perror("sched_getparam");
exit(EXIT_FAILURE);
}
std::cout << " ORIGINAL: ";
std::cout << "policy=" << ((policy == SCHED_FIFO) ? "SCHED_FIFO" :
(policy == SCHED_RR) ? "SCHED_RR" :
(policy == SCHED_OTHER) ? "SCHED_OTHER" :
"???")
<< ", priority=" << param.sched_priority << std::endl;
policy = SCHED_RR;
param.sched_priority = 2;
if ((res = sched_setscheduler(getpid(), policy, ¶m)) == -1)
{
perror("sched_setscheduler");
exit(EXIT_FAILURE);
}
boost::thread t1(&threadfunc);
displayAndChange(t1);
t1.join();
return 0;
}
Arafangion: Haben Sie etwas, um das zu untermauern? Die Linux-Manpage für pthread_attr_setschedparam sagt, es funktioniert. Auch meine persönliche Erfahrung ist, dass es genauso funktioniert wie dokumentiert. –