그건 어떻게 할 것인가에 대한 기본 템플릿이지만 주위를 검색 한 후에는 아무 코드 예제도 발견되지 않으므로 평결이 최선인지 아닌지에 따라 결정됩니다.
문제는 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;
}
Arafangion : 백업 할 항목이 있습니까? pthread_attr_setschedparam에 대한 linux 맨 페이지는 작동한다고 말합니다. 또한, 내 개인적인 경험은 정확하게 문서화 된대로 작동한다는 것입니다. –