pthread 함수 정리

hokim·2021년 5월 12일
0

1] Thread

1. pthread_create()


  • 기본형
int pthread_create(pthread_t * restrict thread,
		const pthread_attr_t *restrict attr,
		void *(*start_routine)(void *),
		void *restrict arg);
  • 매개변수 정보
pthread_t *restrict thread
	스레드의 식별자
    
const pthread_attr_t *restrict attr
	설정할 스레드 속성정보(NULL 입력시 기본설정 적용)
    
void *(*start_routine)(void *)
	스레드가 실행할 함수
    
void *restrict arg
	스레드가 실행할 함수에 들어갈 인자
  • attr 정보
 Thread attributes:
                   Detach state        = PTHREAD_CREATE_JOINABLE
                   Scope               = PTHREAD_SCOPE_SYSTEM
                   Inherit scheduler   = PTHREAD_INHERIT_SCHED
                   Scheduling policy   = SCHED_OTHER
                   Scheduling priority = 0
                   Guard size          = 4096 bytes
                   Stack address       = 0x40196000
                   Stack size          = 0x201000 bytes

1) 함수 호출

pthread_create() 함수 호출 시 새 스레드가 생성되고, 생성된 스레드는 start_routine(arg)를 실행합니다.

생성된 스레드는 다음 세가지 경우에 종료됩니다.

- pthread_exit() 호출
- start_routine() 수행 후 return
- pthread_cancel() 호출

**2) return **

-성공시 0을 반환하고 스레드의 식별자를 thread_t에 담음
-오류 발생시 오류 번호를 반환하고 thread_t를 정의하지 않음

3)에러

ERRORS

EAGAIN	리소스가 부족하여 다른 스레드를 만들 수 없습니다.
EINVAL	attr의 설정이 잘못되었습니다.
	스레드 수가 제한을 넘었습니다. 
EPERM	attr에 지정된 스케줄링 정책 및 매개 변수를 
       설정할 수 있는 권한이 없습니다.

2. pthread_join()


  • 기본형
int pthread_join(pthread_t thread, void **retval);
  • 매개변수 정보
pthread_t thread
	스레드의 식별자
void **retval
	스레드에 할당된 함수 실행 후 종료상태

1) 함수 호출

pthread_join() 함수를 쓰면 지정된 스레드가 종료될때까지 기다리며, 스레드가 이미 종료된 경우에는 즉시 반환됩니다. 지정된 스레드는 attr 설정에서 JOINABLE(default 설정)로 되어있어야 합니다.

대상 스레드의 종료 상태가 retval로 반환됩니다.

2) return

-성공시 0 반환
-오류 발생시 오류 번호 반환

3) error

ERRORS

EDEADLK	교착 상태가 탐지되었거나 대상 스레드가 자기 자신을 지정합니다.
EINVAL	JOINABLE한 스레드가 아니거나 
	다른 스레드가 이미 이 스레드에 가입하려고 대기 중입니다.
ESRCH	해당 ID의 스레드를 찾을 수 없습니다.

3. pthread_detach()


  • 기본형
int pthread_detach(pthread_t thread);

1) 함수 호출
pthread_detach() 함수로 지정된 스레드는 분리된 것으로 표시됩니다. 해당 스레드가 종료되면 리소스가 자동으로 해제됩니다.

2) return

-성공시 0 반환
-오류 발생시 오류 번호 반환

3) error

ERRORS
EINVAL	결합 가능한 스레드가 아닙니다.
ESRCH 	해당 ID의 스레드를 찾을 수 없습니다.

2] mutex

1. pthread_mutex_init()


  • 기본형
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
	const pthread_mutexattr_t *restrict attr)
    
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //매크로
  • 매개변수 정보
pthread_mutex_t *restrict mutex
	초기화할 mutex
    
const pthread_mutexattr_t *restrict attr
	설정할 mutex 속성정보(NULL 입력시 기본설정 적용)

1) 함수 호출

pthread_mutex_init() 함수는 attr에 의해 지정된 속성으로 지정된 뮤텍스를 초기화합니다. 초기화에 성공하면 뮤텍스의 상태가 초기화되고 잠금 해제됩니다.

기본 Mutex 속성을 NULL로 지정할 경우, PSTREAD_MUTEX_Initializer 매크로를 사용하여 뮤텍스를 초기화할 수 있습니다.

2) return

-성공시 0 반환
-오류 발생시 오류 번호 반환

3) error

ERRORS

EINVAL 프로세스 공유 속성이 설정되지 않았습니다.

2. pthread_mutex_destroy()


  • 기본형
int pthread_mutex_destroy(pthread_mutex_t *mutex);

1) 함수 호출

pthread_mutex_destroy() 함수는 지정된 mutex 객체를 파괴합니다.

2) return

-성공시 0 반환
-오류 발생시 오류 번호 반환

3) error

ERRORS

EAGAIN 뮤텍스를 초기화하는 데 필요한 리소스(메모리 제외)가 부족합니다.
ENOMEM 메모리가 부족하여 뮤텍스를 초기화할 수 없습니다.
EPERM  호출자에게 작업을 수행할 수 있는 권한이 없습니다
EINVAL	프로세스 공유 속성이 설정되지 않았습니다.

3. pthread_mutex_lock()


  • 기본형
int pthread_mutex_lock(pthread_mutex_t *mutex);

1) 함수 호출

pthread_mutex_lock()를 이용해 뮤텍스 객체를 잠글 수 있습니다.
뮤텍스가 이미 다른 스레드에 의해 잠겨 있는 경우, 호출 스레드는 뮤텍스를 사용할 수 있을 때까지 블록됩니다.

프로세스가 뮤텍스 잠금을 유지하는 동안 종료된 경우, pthread_mutex_lock()은 오류 값[EOWNERDEAD]을 반환합니다.

2) return

-성공시 0 반환
-오류 발생시 오류 번호 반환

3) error

ERRORS

EGAIN		mutex가 최대 재귀 잠금 수를 초과했습니다.
EINVAL		mutex는 PSTRAD_PRIO_PROTECT 값을 가진 프로토콜 특성을 
		사용하여 생성되었으며 호출 스레드의 우선 순위가 mutex의 
		현재 우선 순위 상한보다 높습니다.
ENOTRECOVERABLE 뮤텍스에 의해 보호되는 상태를 복구할 수 없습니다.
EOWNERDEAD	이전 소유 스레드는 mutex 잠금을 유지한 상태에서 종료되었습니다.
EDEDLK		현재 스레드가 이미 PTHREAD_MUTEX_ERRORCHECK인 
		뮤텍스를 소유하고 있거나, 교착 상태가 탐지되었습니다.

4. pthread_mutex_unlock()


  • 기본형
int pthread_mutex_unlock(pthread_mutex_t *mutex);

1) 함수 호출

pthread_mutex_unlock()은 다음 표에 설명된 대로 동작해야 합니다.

|Mutex Type | Robustness | Relock | Unlock When Not Owner |
|---|---|---|---|
|NORMAL|non-robust|deadlock| undefined behavior |
|NORMAL| robust | deadlock | error returned |
|ERRORCHECK | either | error returned | error returned |
|RECURSIVE | either | recursive | error returned |
|DEFAULT | non-robust | undefined behavior| undefined behavior |
|DEFAULT | robust | undefined behavior| error returned |

2) return

-성공시 0 반환
-오류 발생시 오류 번호 반환

3) error

ERRORS

EPERM	mutex 유형이 PSTRAD_MUTEX_ERRORCheck 또는 
	PSTRAD_MUTEX_RECURIVE이며,
	현재 스레드는 mutex를 소유하지 않습니다.

3] semaphore

1. sem_open()


  • 기본형
       sem_t *sem_open(const char *name, int oflag);
       sem_t *sem_open(const char *name, int oflag,
                       mode_t mode, unsigned int value);
  • 매개변수 정보
const char *name
	세마포어의 이름을 지정합니다.
int oflag
	오픈 플래그를 지정합니다.(ex : O_CREATE)
    
*oflag가 O_CREATE인 경우 다음 두 인자를 제공되어야 합니다.

mode_t mode
	새 세마포어에 배치될 권한을 지정합니다.
unsigned int value
	세마포어의 초기 값을 지정합니다.

1) 함수 호출
sem_open()를 호출하면 지정된 이름으로 은 새 세마포어를 만들거나 기존 세마포를 엽니다. mode가 O_CREATE인 경우 세마포어가 존재하지 않는다면 세마포어가 생성되고, 동일한 name을 가진 세마포어가 이미 있으면 mode와 value는 무시됩니다.

만약 oflag = O_CREATE | O_EXCL 인 경우, 동일한 name을 가진 세마포어가 이미 존재하면 에러가 반환됩니다.

2) return

-성공시 새 세마포어의 주소 반환
-오류 발생시 SEM_FAIL을 반환하고 errno에 오류 번호 저장

3) error

ERRORS

EACCES	세마포어가 존재하지만 세마포어를 열 수 있는 권한이 없습니다.
EEXIST	oflag = O_CREATEㅣO_EXCL 인데 이 이름을 가진 세마포어가 이미 있습니다.
EINVAL	값이 SEM_VALUE_MAX보다 큽니다.
EINVAL	이름은 "/"로만 구성되고 그 뒤에 다른 문자가 없습니다.
EMFILE	프로세스당 fd수에 대한 제한에 도달했습니다.
ENFILE	열려 있는 총 파일 수에 대한 시스템 전체 제한에 도달했습니다.
ENOENT	O_CREATE 플래그가 oflag에 지정되지 않았는데 해당 이름을 가진
	세마포어가 없습니다. 또는 O_CREATE가 지정되었지만 이름이 제대로
	형성되지 않았습니다.
ENOMEM: 메모리가 부족합니다.

ENAMETOOLONG	이름이 너무 깁니다.

2. sem_close()


  • 기본형
int sem_close(sem_t *sem);

1) 함수 호출

sem_close()는 해당 세마포어를 닫고, 시스템이 이 세마포를 호출하는 과정에 할당한 모든 자원을 해제합니다.

2) return

-성공시 0 반환
-오류 발생시 -1을 반환하고 errno에 오류 번호 저장

3. sem_post()


  • 기본형
int sem_post(sem_t *sem);

1) 함수 호출

sem_post()는 해당 세마포어를 잠금 해제하고 증가시킵니다. 세마포어의 값이 0보다 커지면, sem_wait()에서 블록된 다른 스레드가 세마포어에 접근할 수 있습니다.

2) return

-성공시 0 반환
-오류 발생시 -1을 반환하고 errno에 오류 번호 저장

3. sem_wait()


  • 기본형
int sem_wait(sem_t *sem);

1) 함수 호출

sem_wait()는 해당 세마포어를 잠그고 감소시킵니다. 세마포어의 값이 0보다 크면 감소가 진행되며 함수는 즉시 반환됩니다. 세마포어가 현재 0이라면, 세마포어 값이 0보다 커질 때까지, 또는 신호 처리기의 인터럽트로 호출이 중단될 때까지 블록됩니다.

2) return

-성공시 0 반환
-오류 발생시 -1을 반환하고 errno에 오류 번호 저장

관심 있을 만한 포스트

0개의 댓글