본문 바로가기
C | C++

<pthread.h>

by saniii 2022. 4. 30.
#include <pthread.h>

 

 

# pthread_attr_t

 

 

 

# pthread_create()

호출 프로세스 내에서 새로운  쓰레드를 생성한다. 

#include <pthread.h>

int	pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
  •  파라미터
    • *thread : pthread_create()호출이 성공하면 반환 전에 새 스레드의 ID를 *thread에 저장한다. 
    • *attr : pthread_attr_t 구조체로 스레드 생성 시점에 사용해서 새 스레드의 속성을 결정한다. 
    • *start_routine : 새 스레드는 start_routine() 호툴로 실행을 시작한다. 
    • *arg : start_routine에 전달되는 유일한 인자 
  • 반환값
    • 성공 : 0을 반환
    • 실패 : 오류번호를 반환한다. 
      • EAGAIN : 스레드를 새로 생성할 자원이 충분하지 않다. 
      • EINVAL : attr에 유효하지 않은 설정
      • EPERM : attr에 지정한 스케줄링 정책과 매개변수를 설정할 권한이 없다. 

 

 

# pthread_detach()

thread가 나타내는 스레드를 분리된 것으로 표시한다. 분리된 스레드가 종료하면 자원이 자동으로 시스템으로 해제된다. 

#include <pthread.h>

int	pthread_detach(pthread_t thread);
  • 파라미터
    • thread : 분리하려는 스레드 
  • 반환값
    • 성공 : 0을 반환
    • 실패 : 오류 번호를 반환한다. 
      • EINVAL : thread가 합류 가능 스레드가 아니다. 
      • ESRCH : ID가 thread인 스레드를 찾을 수 없다. 

 

 

# pthread_join()

thread가 가리키는 스레드가 종료하기를 기다린다. 이미 종료했으면 pthread_join()이 즉시 반환한다. 

thread가 합류가능한 스레드여야한다. 

여러 스레드가 동시에 동일 스레드와 합류하려고 할 경우는 규정되지 않았다. pthread_join()을 호출 중인 스레드가 취소되는 경우에는 대상 스레드가 계속 합류 가능 상태로 남는다. (분리되지 않음)

#include <pthread.h>

int	pthread_join(pthread_t thread, void **value_ptr);
  • 파라미터
    • thread : 분리하려는 스레드 
    • value_ptr :
      • NULL이 아니면 대상 스레드의 종료상태를 value_ptr에 복사한다. 
      • 대상 스레드가 취소되면 PTHREAD_CANCELED가 들어간다.
  • 반환값
    • 성공 : 0을 반환
    • 실패 : 오류 번호를 반환한다. 
      • EDEADLK : 교착을 탐지했거나 thread가 호출 스레드를 나타낸다. 
      • EINVAL : thread가 합류 가능 스레드가 아니다. (다른 스레드가 이미 그 스레드와 합류하려고 기다리는 중이다. )
      • ESRCH : ID가 thread인 스레드를 찾을 수 없다. 

 

 

# pthread_muextattr_t

 

 

 

# pthread_mutex_init()

mutex가 가리키는 뮤텍스를 attr이 가리키는 속성들로 초기화한다. 

- attr이 초기화 된 뮤텍스 속성 객체를 가리키고 있지 않은 경우는 규정되어 있지 않다. 

#include <pthread.h>

int      pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
  •  파라미터
    • *mutex : 초기화할 뮤텍스를 가리킨다.
    • *attr : mutex를 초기화할 때 사용할 속성
  • 반환값
    • 성공 : 0을 반환
    • 실패 : 오류번호를 반환한다. 
      • EAGAIN : 스레드를 새로 생성할 자원이 충분하지 않다. 
      • ENOMEM : 뮤텍스를 초기화하기에 충분한 메모리가 없다.
      • EPERM : 호출자에게 동작을 수행하기 위한 특권이 없다. 
      • EINVAL : attr에 유효하지 않은 설정
        • ** attr이 가리키는 속성 객체에 견고 뮤텍스 속성이 설정되어 있으면서 프로세스 공유 속성이 설정되어 있지 않으면 pthread_mutex_init()함수가 실패할 수 있다. 

 

 

# pthread_mutex_destroy

mutex가 가리키는 뮤텍스 객체를 파기한다. 파기하면 뮤텍스 객체는 초기화 안 된 상태가 된다. 

- mutex 인자로 지정한 값이 초기화된 뮤텍스를 가리키고 있지 않은 경우의 동작 방식은 규정되어 있지 않다. 

#include <pthread.h>

int     pthread_mutex_destroy(pthread_mutex_t *mutex);​
  •  파라미터
    • *mutex : 파기할 뮤텍스 객체
  • 반환값
    • 성공 : 0을 반환
    • 실패 : 오류번호를 반환한다. 
      • EAGAIN : 스레드를 새로 생성할 자원이 충분하지 않다. 
      • ENOMEM : 뮤텍스를 초기화하기에 충분한 메모리가 없다.
      • EPERM : 호출자에게 동작을 수행하기 위한 특권이 없다.

 

 

# pthread_mutex_lock()

mutex가 가리키는 뮤텍스 객체를 잠그고 0이나 [EOWNERDEAD]를 반환한다. 뮤텍스가 이미 다른 스레드에 의해 잠겨 있으면 사용 가능해질 때까지 호출 스레드가 블록한다. 이미 잠긴 뮤텍스를 스레드에서 다시 잠그려고 하면 man pthread_mutex_lock의 다시잠그기에 대한 내용대로 동작한다. 

#include <pthread.h>

int     pthread_mutex_lock(pthread_mutex_t *mutex);
  •  파라미터
    • *mutex : 동작을 실행할 뮤텍스 객체
  • 반환값
    • 성공 : 0을 반환
    • 실패 : 오류번호를 반환한다. 
      • EAGAIN : 스레드를 새로 생성할 자원이 충분하지 않다. 
      • EINVAL : 
      • ENOTRECOVERABLE
      • EDEADLK
      • EBUSY
      • EPERM
      • EOWENERDEAD
      • EDEADLK

 

 

 

# pthread_mutex_unlock()

mutex가 가리키는 뮤텍스 객체를 푼다. 뮤텍스를 푸는 방식은 뮤텍스 유형 속성에 따라 다르다. 

pthread_mutex_unlock() 함수를 통해 사용가능해진 뮤텍스 객체는 블록된 스레드들이 있으면 스케줄링 정책에 따라 이 뮤텍스를 획득할 스레드가 정해진다. 

#include <pthread.h>

int     pthread_mutex_unlock(pthread_mutex_t *mutex);
  •  파라미터
    • *mutex : 동작을 실행할 뮤텍스 객체
  • 반환값
    • 성공 : 0을 반환
    • 실패 : 오류번호를 반환한다. 
      • EAGAIN : 스레드를 새로 생성할 자원이 충분하지 않다. 
      • EINVAL : 
      • ENOTRECOVERABLE
      • EDEADLK
      • EBUSY
      • EPERM
      • EOWENERDEAD
      • EDEADLK

 

 

 

 

 

 

[참고]

https://wariua.github.io/man-pages-ko/pthread_create%28%29/

https://wariua.github.io/man-pages-ko/pthread_join%283%29/

https://wariua.github.io/man-pages-ko/pthread_mutex_init%283p%29/

 

'C | C++' 카테고리의 다른 글

open | close | read | write (저수준 파일입출력 함수)  (0) 2022.04.24
[0423] C 에러 해결  (0) 2022.04.23
Makefile  (0) 2022.04.12
[ C ] 동적할당 malloc(), free()  (0) 2021.12.29
[C++] c++ 이 뭔가요?  (0) 2021.10.20

댓글