본문 바로가기
Computer Science/Operating System

Condition Variable이란?

by JuHy_ 2019. 9. 5.

Condition Variable이란?

Condition Variable은 특정 조건을 만족하기를 기다리는 변수라는 의미이다.

따라서 이를 이용하여 주로 thread간의 신호 전달을 위해 사용한다.

하나의 thread가 waiting 중이면 조건을 만족한 thread에서 변수를 바꾸고 signaling을 통해 깨우는 방식이다.

 

Condition Variable 사용법

Condition Variable은 앞서 말했 듯 waiting과 signaling을 사용한다.

따라서 기본적으로 cond_wait()와 cond_signal() 함수를 사용하게 된다.

또한 wait와 signal 내부적으로 unlock()과 lock()이 각각 앞 뒤로 있기 때문에 외부를 lock()과 unlock()으로 감싸야 한다.

 

그렇다면 Condition Variable을 이용하여 join 함수를 만들어봄으로써 사용법을 자세히 알아보자.

 

Join function using Condition Variable

위의 코드는 Condition Variable을 이용하여 Join을 구현한 코드이다.

 

먼저 main 함수를 살펴보면 create 함수를 통해 child를 시작하고 join 함수를 호출한다.

 

child thread 에서는 critical section인 print 함수를 실행하고 exit 함수를 호출한다.

 

이 때 parent thread는 child thread를 생성 후 join 함수를 호출하는데 만약 child thread에서 critical section을 완료하지 못했다면 done 변수가 0이므로 wait 함수를 호출하여 signal을 기다린다.

 

그 후 child thread에서 critical section을 완료하면 done 변수를 1로 바꾸고 signal을 보내 parent를 깨운다.

 

이렇게 child가 모두 실행되고 나서 parent가 실행됨으로써 join을 구현할 수 있다.

 


추가적으로 Condition Variable을 이용하여 Producer/Consumer Problem을 해결해보자.

Producer/Consumer Problem은 생산자는 상품이 없다면 상품을 생산하고, 소비자는 상품이 있다면 소비하는 문제이다.

 

Solution of Producer/Consumer Problem using Condition Variable

이 문제는 풀기 위해 위와 같이 코드를 구성해보았다.

생산자는 상품이 있다면(count=1) wait하고, 소비자는 상품이 없다면(count=0) wait()한다.

그리고 조건이 갖춰져 signal을 통해 깨어나면 생산자는 생산, 소비자는 소비를 한 뒤 signal을 보낸다.

 

하지만 여기에는 큰 문제가 있다.

만약에 소비자가 2명이라면 소비자가 소비를 마친 후 보낸 signal이 다른 소비자를 깨우게 된다면,

이미 상품은 소비자가 소비한 상태이므로 상품이 없는데 소비하게 되는 상황이 발생하게 된다.

 

그렇다면 if 조건문을 while로 바꾸면 되지 않을까?

while 조건문을 통해 count를 계속 검사한다면 위와 같은 상황은 벌어지지 않지만 모두 잠드는 상황이 발생할 수 있다.

 

이를 해결하기 위해서는 Condition Variable을 2개 만들어서 생산자는 소비자만 깨우도록, 소비자는 생산자만 깨우도록 구현해야 한다.

'Computer Science > Operating System' 카테고리의 다른 글

Concurrency Problem의 종류 및 원인  (1) 2019.09.24
Semaphore란?  (0) 2019.09.16
Lock의 개념과 구현 방법  (4) 2019.09.05
Thread와 Thread API  (0) 2019.09.04
Page Swapping이란?  (0) 2019.09.02