repeat
while(flag[1]) do
endwhile
flag[0] = true
임계
flag[0] = false
P()
if (S >0)
then s <- s-1
else wait on the queue Q;
V()
if(exsist waiting process on Q)
then wakeup one of them;
else s <- s+1
생산자 소비(세마포)
# 생산자 소비 문제
(shared variables)
var consumed 세마포 <-1
produced 세마포 <-0
buffer message;
producer Pi --> buffer --> consumer cJ
// 생산
repeat
....
create a new message
P(consumed); //counsumed 처음에 1이므로 P로 0으로 바뀜
buffer<-m
V(produced); //반납으로 생산됐다고 0을 1로 바꿈
....
until(false);
//소비
repeat
...
P(produced) // 생산된 1을 사용하였으므로 0으로 바꿈
m <- buffer // 버퍼에 있던 거 이동
V(consumed) // 소비했으므로 0을 1로 바꿈
consumed the message m;
....
until(false)
Reader-Writer(세마포)
var wmutex, rmutex 세마포 =1, 1
nreaders integer =0
// Reader Ri
repeat
...
P(rmutex)
if(nreaders=0) then
P(wmutex)
endif
nreader <- nreader +1
V(rmutex)
perform read
P(rmutex)
nreadr <- nreader -1
if(nreaders=0) then
V(wmutex)
endif;
V(rmutex)
...
until(false)
// Writer Wj
repeat
...
P(wmutex);
perform write operations
V(wmutex);
...
until(false);