TIL

모니터

세마포의 한계

모니터

mutex

condition variables(s)

모니터 코드

acquire(m); // 모니터의 락 취득
while(!p) { //조건 확인
	wait(m, cv); // 조건 충족 안 되면 대기
}
// ...이런 저런 코드들...
signal(cv2); --OR-- broadcast(cv2); // cv2가 cv와 같을 수도 있음
release(m); // 모니터의 락 반환

생산자 소비자 문제와 모니터

모니터로 해결

public volatile Buffer buffer;
public Lock lock;
public Boolean fullCV;
public Boolean emptyCV;

void producer() {
	while (true) {
		Task myTask = new Task();
		
		lock.acuire();
		
		while(buffer.isFull() {
			wait(lock, fullCV);
		}
		
		buffer.enqueue(myTask);

		signal(emptyCV);

		lock.release();
	}
}

void consumer() {
	while (true) {
		lock.acuire();
		
		while(buffer.isEmpth() {
			wait(lock, emptyCV);
		}
		
		Task myTask = q.dequeue();

		signal(fullCV);

		lock.release();

		duStuff(myTask);
	}
}

자바의 모니터

자바에서의 생산자 소비자 문제

class BoundedBuffer {

	private final int[] buffer = new int[5];
	private int count = 0;

	public synchrozied void produce(int item) {
		while (count == 5) { wait(); }
		buffer[count++] = item;
		notifyAll();
	}

	public void consume() {
		int item = 0;
		synchronized(this) {
			while (count == 0) { wait(); }
			item = buffer[--count];
			notifyAll();
		}
		System.out.println("Consume : " + item);
	}
}

https://youtu.be/Dms1oBmRAlo

https://steady-coding.tistory.com/557