Problem
- Readers 끼리는 동시에 데이터를 읽는 것을 허용한다.
- Wrtier는 shared data에 하나의 writer만 들어갈 수 있다. 이때 reader도 들어갈 수 없다.
-> 어떻게 readers와 writers를 관리하는가에 따라 많은 변수가 존재한다.
rw_mutex
- 1로 초기화mutex
- 1로 초기화read_count
- 0으로 초기화read_count
가 0일 때만 write 가능do {
wait (rw_mutex);
/* writing is perforemed */
signal (rw_mutex);
} while (true)
do {
wait (mutex); // read_count 에 접근 권한 얻기까지 대기
read_count++; // read_count > 1이면, 이미 읽고 있던 프로세스가 있으므로
// writer가 없음이 보장된다.
if (read_count == 1) // reader가 처음으로 들어왔을 경우엔 보장할 수 없으므로
wait(rw_mutex); // writer가 있다면 대기한다.
signal(mutex); // read는 동시에 가능하므로, 기다리고 있던 reader들에게 신호 전송
/* reading is performed */
wait (mutex); // read_count 에 접근 권한 얻기까지 대기
read_count--; // perform 완료
if (read_count == 0) // read_count == 0 이므로, writer가 가능함
signal(rw_mutex); // write
signal(mutex); // write가 끝나면 다시 read. read_count 접근 권한 해제
} while (true)
semaphore chopstick[5]
do {
wait(chopstick[i]);
wait(chopstick[{i+1} % 5]);
// eat
signal(chopstick[i]);
signal(chopstick[(i+1) % 5]);
// think
} while (true);
enum {THINKING, HUNGRY, EATING} state[5]
condition self[5]
: 철학자 i는 그가 HUNGRY 상태지만 젓가락을 집을 수 없을 때 대기한다.monitor DiningPhilosophers {
enum {THINKING, HUNGRY, EATING} state[5];
condition self[5];
void pickup(int i) {
state[i] = HUNGRY;
test(i);
if (state[i] != EATING) self[i].wait; // test하고 왔는데 eating이 아니라면
// 당장 먹을 수 없는 상황이므로 wait
}
void putdown(int i) {
state[i] = THINKING;
test((i+4)%5);
test((i+1)%5);
}
void test(int i) {
if ((state[(i+4)%5] != EATING) && (state[(i+1)%5] != EATING) &&
(state[i] == HUNGRY)) {
state[i] = EATING;
self[i].signal();
}
}
initialization_code() {
for (int i = 0; i < 5; i++)
state[i] = THINKING;
}
atomic_t counter; int value;