2011-12-06 3 views
1

이 프로그램은이 스레드의 고유 번호를 표준 출력에 인쇄하는 TaskCode 함수를 실행하는 5 개의 스레드를 만듭니다.스레드의 속성을 만들고 표시하는 방법

제 질문은 스레드의 속성을 만들고 표시하는 방법입니다.

+4

실패 이유

당신은 항상
ps -Leo cmd, pid, prio, policy 

같은 명령을 사용하여 속성 중 일부는 I가 유사한 게시물을 볼 확인할 수

? –

+0

@DavidSchwartz 내 질문을 업데이트했습니다. – EnexoOnoma

+0

아직 어떤 속성에 대해 이야기하고 있는지 알지 못합니다. 스택 크기와 같은 POSIX pthread 생성 속성을 의미합니까? –

답변

4

pthread_attr_init(3) 맨 페이지에는 스레드에서 사용할 수있는 속성을 검색하는 방법을 보여주는 샘플 프로그램이 포함되어 있습니다.

static void 
    display_pthread_attr(pthread_attr_t *attr, char *prefix) 
    { 
     int s, i; 
     size_t v; 
     void *stkaddr; 
     struct sched_param sp; 

     s = pthread_attr_getdetachstate(attr, &i); 
     if (s != 0) 
      handle_error_en(s, "pthread_attr_getdetachstate"); 
     printf("%sDetach state  = %s\n", prefix, 
       (i == PTHREAD_CREATE_DETACHED) ? "PTHREAD_CREATE_DETACHED" : 
       (i == PTHREAD_CREATE_JOINABLE) ? "PTHREAD_CREATE_JOINABLE" : 
       "???"); 

     s = pthread_attr_getscope(attr, &i); 
     if (s != 0) 
      handle_error_en(s, "pthread_attr_getscope"); 
     printf("%sScope    = %s\n", prefix, 
       (i == PTHREAD_SCOPE_SYSTEM) ? "PTHREAD_SCOPE_SYSTEM" : 
       (i == PTHREAD_SCOPE_PROCESS) ? "PTHREAD_SCOPE_PROCESS" : 
       "???"); 

     s = pthread_attr_getinheritsched(attr, &i); 
     if (s != 0) 
      handle_error_en(s, "pthread_attr_getinheritsched"); 
     printf("%sInherit scheduler = %s\n", prefix, 
       (i == PTHREAD_INHERIT_SCHED) ? "PTHREAD_INHERIT_SCHED" : 
       (i == PTHREAD_EXPLICIT_SCHED) ? "PTHREAD_EXPLICIT_SCHED" : 
       "???"); 

     s = pthread_attr_getschedpolicy(attr, &i); 
     if (s != 0) 
      handle_error_en(s, "pthread_attr_getschedpolicy"); 
     printf("%sScheduling policy = %s\n", prefix, 
       (i == SCHED_OTHER) ? "SCHED_OTHER" : 
       (i == SCHED_FIFO) ? "SCHED_FIFO" : 
       (i == SCHED_RR) ? "SCHED_RR" : 
       "???"); 

     s = pthread_attr_getschedparam(attr, &sp); 
     if (s != 0) 
      handle_error_en(s, "pthread_attr_getschedparam"); 
     printf("%sScheduling priority = %d\n", prefix, sp.sched_priority); 

     s = pthread_attr_getguardsize(attr, &v); 
     if (s != 0) 
      handle_error_en(s, "pthread_attr_getguardsize"); 
     printf("%sGuard size   = %d bytes\n", prefix, v); 

     s = pthread_attr_getstack(attr, &stkaddr, &v); 
     if (s != 0) 
      handle_error_en(s, "pthread_attr_getstack"); 
     printf("%sStack address  = %p\n", prefix, stkaddr); 
     printf("%sStack size   = 0x%x bytes\n", prefix, v); 
    } 
1

pthread_attr_*() 기능 집합을 사용해야합니다. This 링크는 좋은 설명이 있습니다.

0

이 작업을 수행하는 신뢰할 수있는 유일한 방법은 하나를 통해는 pthread_create 동안 전달 된 않은 setattr를 저장하는 것입니다 :하는 API는 현재 스레드의 속성을 반환 할 수 있습니다 따라서 pthread_t 스레드 식별자를 지정 허용하지 않습니다 단일 랩퍼 및 감사/가져 오기 목적으로 랩퍼를 u 리하십시오. 이것은 리눅스 커널 2.6.34 버전에 대한 나의 경험을 기반으로하고 있으며 pthread_attr_getxxxx apis는 신뢰할 만하지 않습니다. 다음은

는 다른 볼 pthread_attr_getxxxx하고 대부분을 사용하여 다음 바인드합니다
pthread_attr_setscope = PTHREAD_SCOPE_SYSTEM 
pthread_attr_setinheritsched = PTHREAD_EXPLICIT_SCHED 
pthread_attr_setschedpolicy = SCHED_FIFO 
pthread_attr_setguardsize = 1k; 
pthread_attr_setstacksize = 32K; 

및 스레드 함수 쿼리 내에서 속성

attr에 설정하여 pthread를 만들기 내 대답을

의 유효성을 검사하는 간단한 테스트입니다 값. 확실히 schedpolicy와 상속 된 매개 변수의 차이를 확인합니다. pthread_attr_getxxx 당신이 얘기 "속성"여기에서 다른 OS 용

관련 문제