#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
process에서 어떤 특성(attr)을 가진 thread를 만들기 위해 사용하는 함수입니다. attr이 NULL이라면 기본특성이 적용됩니다. thread가 생성된 이후 attr이 변경되어도 적용되지 않습니다. 성공적으로 동작을 수행하였다면 thread를 특정할 수 있는 ID를 thread에 저장합니다.
thread가 만들어지면arg를 인자로 받는 start_routine을 수행합니다. start_routine이 행동을 마치고 반환한다면 pthread_exit 은 반환값을 종료코드로 받게 됩니다. 다만 이것은 thread로 main 에서 분리되었을 때의 상황이며 main 에서의 반환은 exit 과 동일합니다.
thread가 종료될 때 메모리는 다른 thread가 pthread_join 을 해서 해제해주어야합니다. 대신 pthread_detach 를 사용한다면 thread가 종료될 때 시스템에서 자동적으로 메모리를 해제합니다. pthread_attr_setdetachstate 함수는 pthread_create 에 특성(attr)을 설정하며 동시에 pthread_detach함수와 동일하게 새로운 thread를 생성합니다.
생성된 thread의 signal속성은 다음과 같이 설정됩니다.
성공한다면 0을 반환합니다. 실패한다면 에서 상황에 맞게 다음의 ERROR중 하나를 반환합니다.
[EAGAIN]
thread를 생성하는 데에 필요한 자원의 부족. [PTHREAD_THREADS_MAX]를 초과한 경우
[EPERM]
호출자가 sheduling속성을 변경할 수 없거나 scheduling정책에 의해 제한되어 있어 권한이 충분하지 않은 경우
[EINVAL]
attr이 유효하지 않은 경우
#include <pthread.h>
int pthread_join(pthread_t thread, void **value_ptr);
원하는 thread가 정지할 때 까지 호출된 스레드의 행동(execution)을 멈춥니다.
성공적으로 기능을 수행하였다면 value_ptr이 NULL이 아닐 때 pthread_exit 에 인자로 들어가는 값이 value_ptr에 저장됩니다. pthread_join이 성공적으로 수행을 마쳤다면 타겟 thread가 종료되었다는 것을 의미합니다. 여러 개의 pthread_join이 동시에 같은 thread를 기다리고 있다면 결과는 보장되지 않습니다(undefined). pthread_join을 호출한 thread가 취소된다면 타겟 thread는 detach되지 않습니다.
성공한다면 0을 반환합니다. 실패한다면 에서 상황에 맞게 다음의 ERROR중 하나를 반환합니다.
[EINVAL]
thread로 넘겨준 thread가 join할 수 있는 상태가 아닌 경우
[ESRCH]
타겟 thread를 찾을 수 없는 경우
[EDEADLK]
타겟 thread가 deadlock상태인 경우
#include <pthread.h>
int pthread_detach(pthread_t thread);
thread의 저장소를 해제할 수 있는지 알아내기 위해 사용합니다. 만약 thread가 종료된 상태가 아니라고 해도 thread를 강제적으로 종료하지는 않습니다. 여러 개의pthread_detach가 동일한 thread를 가리키고 있다면 결과는 보장하지 않습니다(undefined).
성공한다면 0을 반환합니다. 실패한다면 에서 상황에 맞게 다음의 ERROR중 하나를 반환합니다. 이전과는 달리 이 함수는 errno를 변경하지 않습니다.
[EINVAL]
thread로 넘겨준 thread가 join할 수 있는 상태가 아닌 경우
[ESRCH]
타겟 thread를 찾을 수 없는 경우
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
새로운 mutex를 생성합니다. attr에 명시된 특성을 따릅니다. attr이 NULL이라면 기본 특성을 적용합니다.
성공한다면 0을 반환하며 attr에 생성된 mutex의 id를 저장합니다. 실패한 경우 아래 명시된 ERROR중 하나를 반한합니다.
[EINVAL]
attr가 유효하지 않은 경우
[ENOMEM]
새로운 mutex를 생성하기에 남은 메모리공간이 충분하지 않은 경우
#include <pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);
mutex에 할당된 메모리공간을 해제합니다.
성공한다면 0을 반환합니다. 실패한다면 에서 상황에 맞게 다음의 ERROR중 하나를 반환합니다.
[EINVAL]
mutex가 유효하지 않은 경우
[EBUSY]
mutex가 lock된 상태인 경우
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
mutex를 lock합니다. 만약 이미 lock이 되어있다면, unlock될 때 까지 기다립니다.
성공한다면 0을 반환합니다. 실패한다면 에서 상황에 맞게 다음의 ERROR중 하나를 반환합니다.
[EINVAL]
mutex가 유효하지 않은 경우
[EBUSY]
mutex를 기다리다가 deadlock이 발생한 경우
#include <pthread.h>
int pthread_mutex_unlock(pthread_mutex_t *mutex);
호출한 thread가 mutex를 lock한 상태라면 unlock합니다.
만약 호출한 thread가 lock을 하지 않았다면 행동은 보장할 수 없습니다(undefined).
성공한다면 0을 반환합니다. 실패한다면 에서 상황에 맞게 다음의 ERROR중 하나를 반환합니다.
[EINVAL]
mutex가 유효하지 않은 경우
[EBUSY]
해당 thread가 mutex를 lock한 것이 아닌 경우