整形信号量
wait(s){
while(s<=0) do no-op;
s:=s-1;}
signal(s){
s:=s+1;}
记录型信号量
P操作:
wait(){
s.value=s.value-1;
if(s.value<0) then block(s.l);
V操作:
signal(){
s.value=s.value+1;
if(s.value<=0) then wakeup(s.l);
1. 生产者—消费者问题
seamphore space=n,goods=0,mutex=1;
void producer(){
while(1){
wait(space);
wait(mutex);
生产;
signal(mutex);
signal(goods);}}
void consumer(){
while(1){
wait(goods);
wait(mutex);
取走;
signal(mutex);
signal(goods);}}
筷子是临界资源,在一段时间内只允许一个哲学家使用。为实现对筷子的互斥使用,用一个信号量表示一只筷子,五个信号量构成信号量数组。
Var chopstick: array [0, …, 4] of semaphore; 所有信号量均被初始化为1。
第i 位哲学家的活动可描述为:
while(1){
wait(c[i]);
wait(c[i+1]);
eat;
signal([i]);
signal([i+1] mod 5);
think;
}
reader(){
repeat
wait(rmutex);
if (readcount=0) then wait(wmutex); 防止写程序进入与读程序冲突;
readcount = readcount+1;
signal(rmutex);
...
read;
...
wait(rmutex);
readcount = readcount-1;
signal(rmutex);
if(readcount=0) then signal(wmutex);
until false;
}
下棋:
1、执黑先行;
2、先抢到先下
full=cutok=payment=receipt=0;
consumer(){
while(1)
{
signal(full);
wait(cutok);
付费;
signal(payment);
wait(receipt);
}
}
lifashi(){
while(1){
wait(full);
signal(cutok);
wait(payment);
signal(receipt);
}