2009-09-25 6 views
25

부스트 라이브러리에는 스레드의 우선 순위를 설정하는 장치가없는 것 같습니다. 이것이 Linux에서 사용하기에 가장 적합한 코드일까요? 아니면 더 좋은 방법이 있습니까?부스트가있는 Linux에서 스레드 우선 순위 설정

boost::thread myThread(MyFunction()); 

struct sched_param param; 
param.sched_priority = 90; 
pthread_attr_setschedparam(myThread.native_handle(), SCHED_RR, &param); 

저는 리눅스 프로그래밍 경험이 많지 않습니다.

+0

Arafangion : 백업 할 항목이 있습니까? pthread_attr_setschedparam에 대한 linux 맨 페이지는 작동한다고 말합니다. 또한, 내 개인적인 경험은 정확하게 문서화 된대로 작동한다는 것입니다. –

답변

22

그건 어떻게 할 것인가에 대한 기본 템플릿이지만 주위를 검색 한 후에는 아무 코드 예제도 발견되지 않으므로 평결이 최선인지 아닌지에 따라 결정됩니다.

문제는 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, &param)) != 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, &param)) != 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(), &param)) == -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, &param)) == -1) 
    { 
     perror("sched_setscheduler"); 
     exit(EXIT_FAILURE); 
    } 

    boost::thread t1(&threadfunc); 

    displayAndChange(t1); 

    t1.join(); 

    return 0; 
} 
+2

필자는 빠른 샘플을 찾아서 수동 페이지를 탐색하지 않고이 유용한 것을 발견했습니다. 감사. –

+0

'boost :: thread'에 비해'QThread'는 스레드 우선 순위를 쉽게 설정할 수있는 부서에서 정말 빛을 발합니다. – rbaleksandar

+0

'std :: thread '와 완벽하게 작동합니다. – ollo

1
나는 생각하지 않는다

리눅스는 정말 스레드 우선 순위가 - 당신은 '좋은'수준을 사용할 수있는 대부분의 커널에, 그러나 그 (스케줄러를 단순화하는 것이다) 그것에 대해 아마 - 그러나, 모든 리눅스 시스템 것 존중해라! (스케쥴러에 따라 다름).

+0

이 답변은 내가 본 또는 리눅스에 대해 들었던 것과 일치하지 않습니다. 어쩌면 당신은 이전 버전을 언급하고 있습니까? – Alex

+0

@Alex : 뭐 들어 봤니? 이전 버전이나 이전 버전의 잘못된 개념을 언급하고있을 가능성이 큽니다. – Arafangion

+0

대답은 스레드 우선 순위 설정 및 리눅스에서의 스케줄링을 보여 주므로 리눅스는 스레드 우선 순위를 구현했습니다. Nice 레벨에 관해서는 http : //git.kernel이라는 문서를 찾았습니다.org/cgit/linux/kernel/git/next/linux-next.git/tree/Documentation/scheduler/sched-nice-design.txt는 단점 (아마도 당신이 설명한 것들)과 어떻게 수정되었는지에 대해 이야기합니다. – Alex

2

당신은 (SVN 저장소를 보면, 광산, 아직 발표하지에 학생에 의해 작성)이 도서관에서 모습을 가질 수 있습니다 기본적으로 https://sourceforge.net/projects/threadutility/

, 그는 부스트의 래퍼 :: 스레드를 썼다 플랫폼 (현재 Linux 또는 Windows)에 따라 적합한 내부 구현을 선택하여 스레드의 우선 순위를 이식성있는 방식으로 지정하고 설정할 수 있습니다. Linux에서이 코드는 sched_setscheduler() 시스템 호출을 사용합니다.

1

boost::threadpthread_create()이 호출되기 전에 pthread 속성을 가져올 수 있습니다. boost::thread::attributes 유형을 제공합니다.이 유형 자체는 스택 크기 (지원하는 시스템에서)를 설정할 때만 사용할 수 있지만 pthread_attr_t을 반환하는 .get_native_handle() 메소드도 제공하며 원하는 속성을 설정할 수 있습니다. 그런 다음 해당 boost::thread::attributes 개체를 인수로 사용하여 make_thread()을 호출하면됩니다. 이 섹션의 두 번째 및 세 번째 코드 상자를 참조하십시오. http://www.boost.org/doc/libs/1_53_0/doc/html/thread/thread_management.html#thread.thread_management.tutorial.attributes

+0

그래서 'boost :: thread'는 우선 순위를 설정하는 방법을 제공하지 않으며 OP가 그의 질문에서 말한 정확한 해결 방법을 사용할 것을 조언합니까? –

+0

차이점은'pthread_create'를 호출하기 전이나 후에 속성을 설정했는지 여부입니다. 문서에 따라'boost :: thread'를 명시 적으로 링크하면 네이티브 핸들을 통해이 저장이 허용되지 않습니다. 여기서는 애트리뷰트에 대한 네이티브 핸들을 얻으므로, pthread 핸들이 있기도 전에 애트리뷰트를 설정할 수있다. – tiberious726

+0

그의 질문에 그는 현재 다음과 같이 말합니다 :'pthread_attr_setschedparam (myThread.native_handle(), SCHED_RR, & param); ' 그래서 그것은 당신이 제안하는 것입니까? –