본문 바로가기
IT/programming

[C/C++] pthread condition 설명

by 어느해겨울 2020. 3. 30.

pthread condition

 

pthread
POSIX 스레드(POSIX Threads, PThread)로 프로그램의 병렬 처리를 제공하는 표준 API, thread는 하나의 프로그램 처리 단위이다.

 

pthread_cond

pthread의 조건 변수를 통한 thread 제어 역할을 수행한다.


1. 사용법

#include <pthread.h>
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
int pthread_cond_destroy(pthread_cond_t *cond);



2. 설명
* 조건 변수(condition variable)
  - 쓰레드간 동기화를 위해서 사용하는 장치로써, 공유되는 데이터의 안정을 보장하기 위한 용도로 주로 사용

* 조건 변수의 작동방식
  - 하나의 쓰레드는 조건변수에 시그널이 전달될 때까지 특정영역에서 대기 상태
  - 만약 다른 쓰레드가 조건변수에 시그널을 보낸다면 대기 상태에서 풀리고 다음 코드로 넘어감
  - 조건변수는 race condition을 피해야하므로 반드시 뮤텍스(mutex)와 함께 사용

* pthread_cond_init
  - int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
  - 조건변수 cond를 초기화하기 위해서 사용되며, cond_attr를 이용해서 조건변수의 특성을 결정
  - NULL을 사용하면 기본특성이 사용
  - 리눅스의 경우 cond_attr은 무시 

* pthread_cond_signal
  - int pthread_cond_signal(pthread_cond_t *cond);
  - 조건변수cond에 시그널을 보내어서 다른 (조건변수 cond에서 기다리는)쓰레드를 깨움
  - cond에서 기다리는 쓰레드가 없다면 아무런 일도 일어나지 않음
  - 여러개의 쓰레드가 cond에서 기다리고 있다면 정확히 이중 하나가 깨어남 그러나 어떤게 깨어날지는 알 수 없음 

* pthread_cond_boradcast
  - int pthread_cond_broadcast(pthread_cond_t *cond);
  - 조건변수cond에서 기다리는 모든 쓰레드를 깨움
  - 기다리는 쓰레드가 없다면 아무런 일도 일어나지 않음

* pthread_cond_wait
  - int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
  - 조건변수 cond로 시그널이 전달되기를 기다림
  - 호출되면 자동적으로 mutex잠금을 되돌려줌(내부적으로 pthread_unlock_mutex()를 호출)
    이 함수를 호출한 쓰레드는 조건변수에 시그널이 전달될 때까지 기다리며, 이때 CPU는 소비하지 않음
    시그널을 전달받아서 쓰레드가 깨어나면 자동적으로 mutex잠금(pthread_lock_mutex()를 사용)

* pthread_cond_timedwait
  - int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
  - pthread_cond_wait()의 시간제한 버젼으로 abstime를 이용해서 제한시간이 지날 때까지 시그널이 전달되지 
    않았을 경우 리턴된다는 것을 제외하고는 pthread_cond_wait()와 동일하게 작동
  - 제한시간이 지나서 리턴되었을 경우 errno로 ETIMEOUT을 설정
  - abstime에 대해서는 time(2)와, gettimeofday(2)를 참고

* pthread_cond_destroy
  - int pthread_cond_destroy(pthread_cond_t *cond);
  - 조건변수를 삭제해서 자원을 되돌려줌


3. 반환값 & 에러
  - 성공  0 반환
  - 실패 -1 반환, 적당한 errno 값을 설정
    -- pthread_cond_init(), pthread_cond_signal(), pthread_cond_broadcast(), pthread_cond_wait()
       에러코드를 리턴하지 않음


    -- pthread_cond_timewait()
       ETIMEDOUT : 시간초과 검사를 위해 지정된 abstime를 초과해서 시그널이 발생하지 않았을 때


    -- pthread_cond_destory()
       EBUSY    : cond에 기다리고 있는 쓰레드가 남아있음

댓글