Published 2020. 4. 29. 12:05

PTHREAD

POSIX Thread(약어 PThread)는 유닉스 계열 시스템에서 일반적으로 사용하는 스레드 관련 표준 API이다.

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

스레드 생성을 위해서 사용한다.

 

  1. 첫번째 argument인 thread 는 스레드가 성공적으로 생성되었을때 생성된 스레드를 식별하기 위해서 사용되는 스레드 식별자이다.
  2. 두번째 argument인 attr 은 스레드 특성을 지정하기 위해서 사용하며, 기본 스레드 특성을 이용하고자 할 경우에 NULL 을 사용한다.
  3. 세번째 argument인 start_routine는 분기시켜서 실행할 스레드 함수이며,
  4. 네번째 argument인 arg는 스레드 함수의 인자이다.

성공적으로 생성될경우 0을 리턴한다.

int pthread_join(pthread_t th, void **thread_return);

: 첫번째 argument인 th는 기다릴(join)할 스레드 식별자이며, 두번째 argument thread_return은 스레드의 리턴(return) 값이다. thread_return 이 NULL 이 아닐경우 해다 포인터로 스레드 리턴 값을 받아올수 있다.

int pthread_detach(pthread_t th);

: detach 는 “떼어내다” 라는 뜻을 가지며 main 스레드에서 pthread_create를 이용해 생성된 스레드를 분리시킨다. 이 함수는 식별자인 th는 스레드를 detach 시키는데, detach 되었을경우 해당(detach 된) 스레드가 종료될경우 pthread_join 을 호출하지 않더라도 즉시 모든 자원이 해제(free) 된다.

void pthread_exit(void *retval);

: pthread_exit는 현재 실행중인 스레드를 종료시키고자 할때 사용한다. 만약 pthread_cleanup_push가 정의되어 있다면, pthread_exit가 호출될경우 cleanup handler가 호출된다. 보통 이 cleanup handler은 메모리를 정리하는 등의 일을 하게 된다.

void pthrad_cleanup_push(void (*routine) (void *), void *arg);

: 이것은 cleanup handlers를 인스톨하기 위해서 사용된다. pthread_exit(3) 가 호출되어서 스레드가 종료될때 pthread_cleanup_push에 의해서 인스톨된 함수가 호출된다. routine이 스레드가 종료될때 호출되는 함수이다. arg는 argument이다. cleanup handlers 는 주로 자원을 되돌려주거나, mutex 잠금등의 해제를 위한 용도로 사용된다.

 

만약 mutex 영역에서 pthread_exit가 호출되어 버릴경우 다른 스레드에서 영원히 block 될 수 있기 때문이다. 또한 malloc으로 할당받은 메모리, 열린 파일지정자(=file descriptor)를 닫기 위해서도 사용한다.

void pthread_cleanup_pop(int execute);

: pthread_cleanup_push와 함께 사용되며, install 된 cleanup handler을 제거하기 위해서 사용된다.

만약 execute 가 0 이라면, pthread_cleanup_push에 의해 인스톨된 cleanup handler를 (실행시키지 않고)삭제만 시킨다. 0이 아닌 숫자라면 cleanup handler을 실행시키고 삭제 된다.

 

'🚦 Server > Operating System' 카테고리의 다른 글

11. Process Scheduling (2)  (0) 2020.05.05
10. Process Scheduling (1)  (0) 2020.04.29
fork() 와 exec()  (6) 2020.04.28
09. Threads (3)  (0) 2020.04.27
PA1: My Simple Shell  (0) 2020.04.27
복사했습니다!