42 Philosophers (1)

sangkkim·2022년 8월 3일
0

Mandatory 함수 살펴보기

usleep

gettimeofday

thread 관련 함수

pthread_create

#include <pthread.h>

SYNOPSIS

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

DESCRIPTION

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속성은 다음과 같이 설정됩니다.

  • signal mask는 생성한 thread의 mask를 그대로 상속받습니다.
  • 입력받은 signal은 비어있습니다.

RETURN VALUES

성공한다면 0을 반환합니다. 실패한다면 에서 상황에 맞게 다음의 ERROR중 하나를 반환합니다.

ERRORS

[EAGAIN]
thread를 생성하는 데에 필요한 자원의 부족. [PTHREAD_THREADS_MAX]를 초과한 경우
[EPERM]
호출자가 sheduling속성을 변경할 수 없거나 scheduling정책에 의해 제한되어 있어 권한이 충분하지 않은 경우
[EINVAL]
attr이 유효하지 않은 경우

pthread_join

HEADER

#include <pthread.h>

SYNOPSIS

int	pthread_join(pthread_t thread, void **value_ptr);

DESCRIPTION

원하는 thread가 정지할 때 까지 호출된 스레드의 행동(execution)을 멈춥니다.

성공적으로 기능을 수행하였다면 value_ptr이 NULL이 아닐 때 pthread_exit 에 인자로 들어가는 값이 value_ptr에 저장됩니다. pthread_join이 성공적으로 수행을 마쳤다면 타겟 thread가 종료되었다는 것을 의미합니다. 여러 개의 pthread_join이 동시에 같은 thread를 기다리고 있다면 결과는 보장되지 않습니다(undefined). pthread_join을 호출한 thread가 취소된다면 타겟 thread는 detach되지 않습니다.

RETURN VALUES

성공한다면 0을 반환합니다. 실패한다면 에서 상황에 맞게 다음의 ERROR중 하나를 반환합니다.

ERRORS

[EINVAL]
thread로 넘겨준 thread가 join할 수 있는 상태가 아닌 경우
[ESRCH]
타겟 thread를 찾을 수 없는 경우
[EDEADLK]
타겟 thread가 deadlock상태인 경우

pthread_detach

HEADER

#include <pthread.h>

SYNOPSIS

int	pthread_detach(pthread_t thread);

DESCRIPTION

thread의 저장소를 해제할 수 있는지 알아내기 위해 사용합니다. 만약 thread가 종료된 상태가 아니라고 해도 thread를 강제적으로 종료하지는 않습니다. 여러 개의pthread_detach가 동일한 thread를 가리키고 있다면 결과는 보장하지 않습니다(undefined).

RETURN VALUES

성공한다면 0을 반환합니다. 실패한다면 에서 상황에 맞게 다음의 ERROR중 하나를 반환합니다. 이전과는 달리 이 함수는 errno를 변경하지 않습니다.

ERRORS

[EINVAL]
thread로 넘겨준 thread가 join할 수 있는 상태가 아닌 경우
[ESRCH]
타겟 thread를 찾을 수 없는 경우

mutex 관련 함수

pthread_mutex_init

HEADER

#include <pthread.h>

SYNOPSIS

int	pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

DESCRIPTION

새로운 mutex를 생성합니다. attr에 명시된 특성을 따릅니다. attr이 NULL이라면 기본 특성을 적용합니다.

RETURN VALUES

성공한다면 0을 반환하며 attr에 생성된 mutex의 id를 저장합니다. 실패한 경우 아래 명시된 ERROR중 하나를 반한합니다.

ERRORS

[EINVAL]
attr가 유효하지 않은 경우
[ENOMEM]
새로운 mutex를 생성하기에 남은 메모리공간이 충분하지 않은 경우

pthread_mutex_destroy

HEADER

#include <pthread.h>

SYNOPSIS

int	pthread_mutex_destroy(pthread_mutex_t *mutex);

DESCRIPTION

mutex에 할당된 메모리공간을 해제합니다.

RETURN VALUES

성공한다면 0을 반환합니다. 실패한다면 에서 상황에 맞게 다음의 ERROR중 하나를 반환합니다.

ERRORS

[EINVAL]
mutex가 유효하지 않은 경우
[EBUSY]
mutex가 lock된 상태인 경우

pthread_mutex_lock

HEADER

#include <pthread.h>

SYNOPSIS

int	pthread_mutex_lock(pthread_mutex_t *mutex);

DESCRIPTION

mutex를 lock합니다. 만약 이미 lock이 되어있다면, unlock될 때 까지 기다립니다.

RETURN VALUES

성공한다면 0을 반환합니다. 실패한다면 에서 상황에 맞게 다음의 ERROR중 하나를 반환합니다.

ERRORS

[EINVAL]
mutex가 유효하지 않은 경우
[EBUSY]
mutex를 기다리다가 deadlock이 발생한 경우

pthread_mutex_unlock

HEADER

#include <pthread.h>

SYNOPSIS

int	pthread_mutex_unlock(pthread_mutex_t *mutex);

DESCRIPTION

호출한 thread가 mutex를 lock한 상태라면 unlock합니다.
만약 호출한 thread가 lock을 하지 않았다면 행동은 보장할 수 없습니다(undefined).

RETURN VALUES

성공한다면 0을 반환합니다. 실패한다면 에서 상황에 맞게 다음의 ERROR중 하나를 반환합니다.

ERRORS

[EINVAL]
mutex가 유효하지 않은 경우
[EBUSY]
해당 thread가 mutex를 lock한 것이 아닌 경우

0개의 댓글