Это основной шаблон того, как я бы это сделал, но после поиска я не нашел почти никаких примеров кода, поэтому я думаю, что вердикт о том, лучший он или нет, вынесен.
проблема в том, что boost :: thread не имеет конструктора, который позволяет передавать атрибуты pthead при создании потока, поэтому вам нужно вносить изменения после запуска потока. Единственный известный мне способ обойти это ограничение - это наследование расписания процесса / потока. Если не указано иное, новые потоки унаследуют расписание / приоритет своего создателя, поэтому вы можете изменить текущий поток перед созданием рабочих потоков, а затем изменить обратно, если хотите. Выглядит неудобно, но это альтернатива.
Вот взлом примера, который, надеюсь, демонстрирует оба. Возможно, вам придется изменить политику и приоритет соответствующим образом и запустить его от имени пользователя root.
Будьте осторожны с тем, как вы устанавливаете приоритет. Применяются различные ограничения.
#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;
}
Я не думаю, что Linux действительно имеет приоритеты потоков - в большинстве ядер вы можете использовать «Хорошие» уровни, но это, вероятно, все (что упростило бы scheduler) - однако не все Linux-системы будут это учитывать! (Зависит от планировщика).