세마포어의 문제점
semWait
, semSignal
연산이 프로그램 전체에 산재함모니터를 이용한 병행 제어
synchronized
키워드로 락 걸기/* 생산자 소비자 프로그램 */
monitor boundedbuffer; /* 데이터를 저장하고 꺼내가는 곳 */
char buffer (N); /* N개의 문자가 저장될 수 있는 버퍼 */
int nextin, nextout; /* 버퍼 포인터 */
int count; /* 버퍼 내부에 추가된 문자 개수 */
cond notfull, notempty /* 동기화를 위한 조건 변수 */
void append(char x)
{
if (count == N) cwait(notfull); /* 버퍼에 문자가 가득 찬 경우, 오버플로우 감지 => 기다림 */
/* 생산자 코드 */
buffer(nextin) = x;
nextin = (nextin + 1) % N;
count++;
/* 버퍼에 문자 하나를 추가 */
csignal(notempty); /* notempty 조건 변수에서 대기하고 있는 프로세스를 깨움*/
}
void take(char x)
{
if (count == 0) cwait(notempty); /* 버퍼가 빈 경우, 언더플로우 방지*/
/* 데이터를 꺼내는 코드 */
x = buffer(nextout);
nextout = (nextout + 1) % N;
count--; /* 버퍼에서 문자 하나를 삭제 */
/* 데이터를 꺼내고 하나가 비면 다른 하나가 다시 차길 기다림 */
csignal(notfull); /* notfull 조건 변수에서 대기하고 있는 프로세스를 깨움 */
}
{ /* 모니터 몸체 */
nextin = 0; nextout = 0; count = 0; /* 버퍼 변수 초기화 */
}
void producer()
{
char x;
while (true) {
produce(x);
append(x);
}
}
void consumer()
{
char x;
while (true) {
take(x);
consume(x);
}
}
void main()
{
parbegin(producer, consumer)
}