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에 기다리고 있는 쓰레드가 남아있음
'IT > programming' 카테고리의 다른 글
[C/C++] signal handler library 활용과 소스코드 공유 (0) | 2021.12.24 |
---|---|
[C/C++] C언어 main 함수 전/후에 함수를 실행 하는 방법 (0) | 2021.12.21 |
[C/C++] pthread_mutex_lock 설명 (0) | 2020.03.30 |
[C/C++] C언어 출력에 색깔 입히기 예제 (1) | 2015.12.16 |
[C/C++] 음수에서 양수로 변환 예제 (0) | 2014.12.19 |
댓글