티스토리 뷰
what?
조건변수란 스레드간 통신을 위해 공유데이터에 대한 상태를 서로 주고 받기 위해서 사용하는 변수이다.
how?어떻게 사용?
*반드시 뮤텍스와 함께 사용*
조건변수에 대한 정보를 알기 위해서 기다리는 함수를 호출.
<int pthread_con_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);>
=> cond에 조건 알림(signal)이 발생할 때까지 대기하는 함수.
cond : 조건변수 인자
mutex : 조건변수를 mutex로 "제어"하며 공유데이터에 대한 접근을 제어하는데 사용
<뮤텍스 wait의 사용 절차>
=> 호출함수 사용시 : mutex를 해당 스레드가 얻어야(lock) pthread_cond_wait가 가능함.
=> 호출발생시(호출이 적용되는 순간) : wait를 호출하는 순간에는 mutex를 해제(umlock)해야 가능함.
=> 이후, wait는 블록상태로 정보를 얻을 thread가 cond를 siganl한 경우까지 대기
=> 이후, signal을 받고 깨어나며 뮤텍스를 자동적으로 다시 얻음(unlock).
스레드가 조건변수를 기다리기 위해서는 pthread_cond_wait()를 호출해야하며[이때의 상태 : mutex lock의 상태여야 함수를 적용시킬 수 있음] pthread_cond_wait()호출시 내부적으로 발생하는 동작의 절차
1. 뮤텍스 해제 -> 2. wait()함수의 블록상태 -> 3. siganl을 get (조건알림을 받음) -> 4. 깨어나며(블록 해제) 뮤텍스 얻음(mutex lock)
+ <int pthread_cond_timedwait() : 지정한 시간만 블록상태에서 조건알림을 기다림.>
<int pthread_cond_siganl(pthread_cond_t *cond);>
- 3번 절차에서 필요한 signal을 받기 위해 상대방이 signal을 보내줄 필요가 있음. 이때 pthread_cond_siganl(pthread_cond_t *cond)를 사용.
- 만약 보내는 thread가 하나인데 signal을 읽는 thread가 여러개일때, 못 받았다면 여러 스레드가 block상태에서 못 깨어날 수 있기에 broadcast 방법으로 전송하지만, 모두 get하는 것이랑은 다름. get을 하기 위해서는 mutex로 제어하기 때문에 mutex가 lock이 되어있는 thread만 wait()를 사용가능
<뮤텍스의 생성과 삭제>
- 초기화 :
1. 함수 : pthread_cond_itit(&초기화할 조건변수명, 속성(NULL : 기본속성))
2. 매크로 : PTHREAD_COND_INITALIZER를 사용
1. or 2.사용해서 cond(조건변수)를 초기화
- 삭제 :
pthread_cond_destory(&삭제할 조건변수명);
why? 왜사용?
- 공유 데이터의 상태에 대한 정보를 스레드간에 서로 주고 받을 필요가 있을 때 조건변수가 필요함
- 소비자가 큐의 메시지를 읽고 생산자가 큐에 메시지를 쓸 때, 소비자는 생산자가 쓴 메시지가 있을 때만 읽고 싶은데 운영체제는 생산자와 소비자 두 스레드가 교대로 실행되는 것을 보장해주지 않음.
- 따라서, 큐에 메시지가 기록된 사실이 소비자 스레드에게 알려지는 방법이 있으면 좋을 것, 어떤 조건이 만족된 것을 조건변수를 통해 다른 스레드에게 알려주는 기능을 signal을 사용해 조건알림을 보냄.
조건변수 사용 예제
"조건변수를 통해 두 스레드가 정보를 교환하는 예제 프로그램 cond.c"
main thread와 생선된 자식 thread가 공유데이터를 사용해 data값이(공유데이터의 값이) 1이 되도록 main thread가 기다린다.
=> main thread : 조건변수를 wait()할 입장// 자식 thread : 조건변수를 signal()할 입장
=>자식 thread가 일정 시간동안 sleep()후에 data값을 1로 변경 후 부모 스레드에게 조건알림.
=> cond, mutex, 공유데이터 묶어서 사용
typedef sturct _complex{
pthread_mutex_t mutex; //뮤텍스
pthread_cond_t cond; //조건변수
int value; //공유데이터
}thread_control_t;
thread_conrol_t data;
=> data.value가 공유데이터로 처음엔 0에서 -> 이후 1로 바뀌며 siganl이 조건변수를 통해 전송됨.
*이때, 자식 스레드는 시작하자 마자 명령행에서 인자로 넣어준 시간동안 sleep하고 부모 드레드는 pthread_cond_timewait()를 통해 3초만 조건알림을 기다리게함.
자식 스레드는 이후 sleep()에서 깨어나고 공유데이터값을 1로 설정하고 조건변수 data.cond를 통해 signal을 wait중인 main 스레드에게 보냄
즉, 3초 이상 sleep()을 자식 스레드에서 하게 된다면 부모 스레드는 ETIMEDOUT 에러를 발생시킴.

1. data구조체의 mutex와 cond와 value를 초기화
thread_control_t data = {PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITAILIZER,0};
로 뮤텍스, 조건변수, 공유데이터를 초기화. 이때 공유데이터는 처음엔 0으로 설정
2. sleep_time = atoi(argv[1]);로 설정하여 인자로 넘겨받음
3. thread 생성 -> 부모 main thread에서 생성한 자식 thread
pthread_t wait_thr;//thread명을 wait_thr로 설정
(status = pthread_create(&wait_thr, NULL, wait_thread, NULL))가 = 0 이 아닐경우 error를 출력, error가 아니면 정상 thread create됨

4. struct timespec timeout;을 통해 timespec구조체 timeout으로 정의 후 timeout체크

* 만약 sleep()시간인 atoi(argv[1])의 값이 3이상이 되는 경우 time out이 될 것이고 그 미만일경우 signal을 받게될 것임
5. wait()사용전 mutex를 lock
status = pthread_mutex_lock(&data.mutex)가 0이 아닐때 error출력, error가 아니면 정상 lock처리 됨
6. data.value값이 0일때 => (timeout check)일때 value는 여전히 0일때

status = pthread_cond_timewait(&data.cond, &data.mutex, &timeout);
=> status가 error일때 ETIMEDOUT error가 생성
=> status가 정상일때 = wait()시간인 3초보다 sleep()시간이 더 짧은 경우
7. 정상 처리되어(timeout되지 않음) signal을 넘겨받은 경우 = data.value가 1일때 체크

공유데이터값이 1이 되었을 때(timeout되지 않았을 때 + mutex가 잘 lock되었을 때)
자식 스레드가 종료하기를 기다리고 종료시 끝
'네트워크프로그래밍' 카테고리의 다른 글
멀티스레드 예제 - mth_echoserv.c (0) | 2021.06.04 |
---|---|
스레드[경쟁실행, 동기화문제] 예제 (0) | 2021.06.02 |
뮤텍스 [ 스레드 경쟁과 동기화문제] (0) | 2021.06.02 |
스레드 취소요청 (0) | 2021.06.02 |
THREAD 프로그래밍 (0) | 2021.05.31 |
- Total
- Today
- Yesterday
- mm1queue
- stack 컨테이너
- LAMBDA
- 백준 10866
- 소프트웨어공학설계
- 코딩월드뉴스
- 스택 파이썬
- CSMA/CD란?
- 핀테크 트렌드
- 효율적인방법찾기
- 백준 숫자놀이
- 파이썬 알아두면 유용
- 딥러닝입문
- 영화 리뷰 긍정 부정 분류
- 백준 4963
- 백트래킹(1)
- c++덱
- 11053 백준
- 백준 11053 파이썬
- 모듈 사용법
- 백준 15650 파이썬
- 시뮬레이션 c
- 기사작성 대외활동
- 13886
- 기본 텍스트 분류
- 4963 섬의개수
- CREATE ASSERTION
- 온라인프로필 만들기
- 10866 백준
- DRF 회원관리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |