#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 |
댓글