Problem Analysis
IDEA
관리 대상 정보
- DB에 W를 해야 하는지(no data) 여부
- concurrent R
IMPL
- 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);
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();
}