Reader-Writer PS

Problem Analysis


IDEA

관리 대상 정보
  • DB에 W를 해야 하는지(no data) 여부
  • concurrent R

IMPL

w/ Semaphores

  • semaphore mutex = 1, db = 1;
  • readcnt = 0;
writer
P(db);
WRITING-TO-DB();
V(db);
reader
P(mutex);
readcnt++;
if (readcnt == 1) {
	P(db);
}
V(mutex);
 
READING-FROM-DB();
 
P(mutex);
readcnt--;
if (readcnt == 0) {
	V(db);
}
V(mutex);

w/ Monitors

monitor RW {
	int readcnt;
	bool writing = false;
    condition canRead; // reader들이 잠드는 줄
    condition canWrite; // writer들이 잠드는 줄
	
	void write_start() {
		while (writing || readcnt > 0) {
			canWrite.wait()
		}
		writing = true; 
	}
	
	void write_end() {
		writing = false;
		canWrite.signal();
		canRead.broadcast();
	}
	
	void read_start() {
		while (writing) {
			canRead.wait();
		}
		readcnt++; 
	}
	
	void read_end() {
		readcnt--;
		if (readcnt == 0) {
            canWrite.signal();
        }
	}
}
void reader() {
	read_start();
	READ();
	read_end();
}
 
void writer() {
	write_start();
	WRITE();
	write_end();
}