7.1 Classic Problems of Synchronization - p.289

7.1.1 Bounded-Buffer (Producer–Consumer) Problem

세마포어 기반 해결 방법

Semaphore full = 0, empty = n, mutex = 1;

do {
    // Producer
    produce_item(item);
    wait(empty);
    wait(mutex);
    insert_item(item);
    signal(mutex);
    signal(full);
} while(true);

do {
    // Consumer
    wait(full);
    wait(mutex);
    remove_item(item);
    signal(mutex);
    signal(empty);
    consume_item(item);
} while(true);

7.1.2 Readers–Writers Problem

세마포어 기반 코드

Semaphore mutex = 1, rw_mutext = 1;
int read_count = 0;

// writer
while (true) {
	wait(rw_mutex);
	...
	/* writing is performed */
	...
	signal(rw_mutex);
}

// reader
while (true) {
	wait(mutex);
	read_count++;
	if (read count == 1)
		wait(rw_mutex);
	signal(mutex);
	...
	/* reading is performed */
	...
	wait(mutex);
	read_count--;
	if (read count == 0)
		signal(rw_mutex);
	signal(mutex);
}