Automotive Software

포직스 쓰레드 속성 객체 (Attributes Objects) 1 - pthread_attr_t 본문

포직스 (POSIX)/쓰레드 프로그래밍 고급 (Advanced Threaded Program)

포직스 쓰레드 속성 객체 (Attributes Objects) 1 - pthread_attr_t

AutoSW 2020. 9. 24. 18:23

포직스 쓰레드 속성 객체 (Attributes Objects) 1 - pthread_attr_t

쓰레드 프로그래밍에서 쓰레드, 뮤텍스 또는 조건 변수를 사용할 때, 쉽게는 아래와 같이 속성 값을 나타내는 두 번째 인자에 NULL값을 전달하여 시스템상에 정의된 기본값으로 각 객체들을 초기화하여 사용할 수 있다.

[기본 사용 예제]
pthread_create(&threadId, NULL, client_Thread, NULL);

출처: https://autosw.tistory.com/8?category=932055 [Automotive Software]

필요에 따라 객체를 세부적으로 사용하기 위해서는 객체별 속성값을 설정할 수 있으며, 해당 속성 값을 읽어 올 수도 있다. 포직스에서 이러한 설정 및 읽기 동작은 직접적인 멤버 참조가 아닌, 함수를 통해 이루어지게 되는데, 이러한 함수는 간단하게는 매크로를 통해 구현될 수 도 있고, 함수를 통해 구현될 수도 있다.

  1. 속성 객체
    • 쓰레드 속성 (Thread attributes) : pthread_attr_t
    • 뮤텍스 속성 (Mutex attributes) : pthread_mutexattr_t
    • 조건변수 속성 (Condition variable attributes) : pthread_condattr_t
  2. 쓰레드 속성 (기본값)
    • 포직스에서는 기본적으로 아래의 멤버를 속성으로 정의하고 있다.
      • detachstate : 생성되는 쓰레드의 ID와 자원의 재사용 가능 여부를 결정
        • PTHREAD_CREATE_DETACHED : 프로세스의 대기 없이 쓰레드 종료와 함께 ID 및 자원이 재사용 가능
        • PTHREAD_CRETAE_JOINABLE : pthread_join()를 통해 프로세스가 쓰레드가 종료되기를 기다려야 ID 및 자원이 반환되어 재 사용 가능, 그렇지 않으면 점유된 메모리는 재사용 불가하여 메모리 누수 발생
      • stacksize : 쓰레드의 스택 크기 설정
        • 특정 값이 주어지지 않으면 시스템에서 정의하는 기본값이 적용됨
        • 최소한, 매크로(PTHREAD_STACK_MIN)에서 정의한 값보다 큰 값을 적용해야 하지만, 특별히 정의하지 않는 것이 일반적으로 최선의 설정
      • stackaddr : 쓰레드의 스택이 할당된 시작 주소
        • stacksize와 함께 향후 호환성에 문제가 있을 수 있어, 세심히 확인 후 사용해야 함
      • scope : 생성되는 쓰레드의 활동 영역을 정의
        • PTHREAD_SCOPE_PROCESS : 생성되는 프로세스 내에서 존재하는 쓰레드들과 경쟁
        • PTHREAD_SCOPE_SYSTEM : 시스템 전체에 존재하는 쓰레드들과 경쟁
      • inherisched : 상속받을 스케줄링 정책과 우선순위
        • PTHREAD_INHERIT_SCHED : 생성하는 쓰레드(메인 쓰레드)의 스케줄링 정책과 우선순위를 물려받음
        • PTHREAD_EXPLICIT_SCHED : 속성으로 전달되는 값을 스케줄링 정책과 우선순위를 적용
      • schedpolicy : 스케줄링 정책, 사용 전 PTHREAD_EXPLICIT_SCHED를 통해 상속여부 정의할 필요 있음
        • SCHED_FIFO : 피포 방식의 스케줄링
        • SCHED_RR : 라운드 로빈 방식의 스케줄링
        • SCHED_OTHER : 시스템 정의 방식의 스케줄링 (QNX의 경우 SCHED_RR을 솔라리스는 Time-Sharing)
        • SCHED_SPORADIC : 주어진 시간내에서 특정 쓰레드의 실행 시간을 제어하는 스케줄링으로, 주어진 주기적인 시간(Replenishment period, T)마다 쓰레드에 주어진 실행시간(Execution Time, C)만큼 수행될수 있도록 스케줄링
        • 그 외 SCHED_NOCHANGE, SCHED_NOCHANGE가 시스템 별로 추가 지원 가능
      • schedparam : 스케줄링에 적용할 세부 파라미터 값
        • 기본 또는 현재 적용할 우선순위 값, 초기화 소요시간 값 등이 정의
    • 하지만, 속성 멤버는 구현하는 운영체제에 따라 상이할 수 있어 지원되는 함수도 차이가 있을 수 있어, 사용 시 확인이 필요하다.
    • QNX 기본 속성 값 : www.qnx.com/developers/docs/7.0.0/#com.qnx.doc.neutrino.lib_ref/topic/p/pthread_attr_init.html

 

#include <pthread.h>

int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);
int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr );
int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stackaddr );

실 구현 예제는 : autosw.tistory.com/10

 

pthread_attr_t 를 이용한 쓰레드 detached 로 생성하기 예제

#include #include #include /* user defined macro */ #define COUNT_INIT_VALUE 0x00 #define COUNT_DUMMY_VALUE 0xA0 pthread_once_t InitOnce = PTHREAD_ONCE_INIT; /* it needs to be initialized as PTHREAD..

autosw.tistory.com