고급 개발자로 가는 길

C

[C언어] pthread_t 스레드 생성 sched_param 스레드 스케줄링

다크엔지니어 2021. 3. 28. 13:49
반응형

pthread_t

  • POSIX Thread API 이다
  • 리눅스/유닉스에서 스레드 생성 및 관리 할 수 있다.

sched_param

  • 스레드의 스케줄링을 제공한다
  • 구조체의 priority 값으로 우선순의를 정해 스케줄링을 관리한다.

 

아래는 스레드 생성 및 스케줄링에 관한 소스 이다.

#include <pthread.h>

#define MAX_THREAD_IDX				20
#define THREAD_IDX_SOCKET_SERVER	0
#define		P_OTH_PRIORITY			15

pthread_t	rt_threadId[MAX_THREAD_IDX];	

if ( create_pthread(&rt_threadId[THREAD_IDX_SOCKET_SERVER], 0, 0x8,	Thread_Socket_Server, NULL, P_OTH_PRIORITY))

void *Thread_Socket_Server(void *vaArgs)
{
	// example
}

int create_pthread( pthread_t *tid, unsigned int tid_num, uint32_t coremask, void *(*task_routine) (void *), void *arg, int pNum) 
{
    int retval;
	pthread_attr_t pth_attr;
	struct sched_param sched;
	
	if ( pthread_attr_init(&pth_attr) )
		printf("[sysError] main:pthread_attr_init - Thread_DIO_ROUTINE");

	if ( pthread_attr_setinheritsched(&pth_attr, PTHREAD_EXPLICIT_SCHED) )
		printf("[sysError] main:pthread_attr_setinheritsched - Thread_DIO_ROUTINE");
	
	if ( pthread_attr_setschedpolicy(&pth_attr, SCHED_FIFO) )
		printf("[sysError] main:pthread_attr_setschedpolicy - Thread_DIO_ROUTINE");
	
	sched.sched_priority = pNum; //99~1, 0(SCHED_OTHER)
	if ( pthread_attr_setschedparam(&pth_attr, &sched) )
		printf("[sysError] main:pthread_attr_setschedparam - Thread_DIO_ROUTINE");
	else 
		printf("Thread_DIO_ROUTINE priority = %d\n", sched.sched_priority);
	
    retval = pthread_create( tid, &pth_attr, task_routine, arg);
	
    return retval;
}

pthread_attr_init 는 thread 속성 개체를 초기화 한다.

pthread_attr_setinheritsched는 스레드 스케줄링 상속 속성을 얻거나 설정한다.

  • THREAD_INHERIT_SCHED - 스레드를 생성할 때 생성하는 스레드의 스케줄링 속성을 상속받아 사용하며 스레드 속  성 객체 attr은 무시된다.
  • PTHREAD_EXPLICIT_SCHED - 스레드를 생성할 때, 스레드 속성 객체를 사용하여 스레드를 생성한다.

pthread_attr_setschedpolicy는 스레드의 스케줄링 정책을 얻거나 설정한다.

  • 지원되는 스케줄링 정책 값은 SCHED_FIFO, SCHED_RR, 그리고 SCHED_OTHER이며 헤데 파일 <sched.h>에 정의된다.

pthread_attr_setschedparam는 스레드 속성 오브젝트에서 스케줄링 매개 변수 속성 설정이다.

pthread_create로 thread, attr, function pointer, arg 를 넣으면 스레드가 완성된다.

반응형