1 、利用记录型信号量解决生产者——消费者问题
假定在生产者和消费者之间的公用缓冲池,具有n个缓冲区,这时可利用互斥信号量mutex实现诸进程对缓冲池的互斥使用。利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。只要缓冲区未满生产者便可将消息送入缓冲区,只要缓冲区未空消费者便可从缓冲区取走一个消息。
1 Var mutex,empty,full:semapthore:=1,n,0; // 声明互斥信号量mutex=1,n个空缓冲区,满缓冲区个数为0 2 buffer:array[0,1,...,n-1] of item; 3 in,out:integer:=0,0; // 输入、输出指针 4 begin 5 parbegin 6 proceducer:begin 7 repeat 8 ... 9 proceducer an item nextp; // 生产一个产品 10 ... 11 wait(empty); // 申请一个空缓冲区 12 wait(mutex); // 申请一个临界资源使用权 13 buffer(in):=nextp;// 将产品放入缓冲池中 14 in:=(in+1) mod n; // 输入指针向前移一个位置 15 signal(mutex); // 释放临界资源 16 signal(full); // 释放一个满缓冲区 17 until false; 18 end 19 consumer:begin 20 repeat 21 wait(full); // 申请一个满缓冲区 22 wait(mutex); // 申请一个临界资源使用权 23 nextc:=buffer(out); // 从缓冲池取走一个产品 24 out:=(out+1) mod n; // 输出指针向前移一个位置 25 signal(mutex); // 释放临界资源 26 signal(empty); // 释放一个空缓冲区 27 consumer the item in nextc; 28 until false 29 end 30 parend 31 end
2、利用AND信号量解决生产者——消费者问题(看懂了上面的详细分析,下面的伪代码就容易理解多了)
1 Var mutex,empty,full:semapthore:=1,n,0; 2 buffer:array[0,...,n-1] of item; 3 in out:integer:=0,0; 4 begin 5 parbegin 6 proceducer:begin 7 repeat 8 ... 9 proceduce an item in nextp; 10 ... 11 Swait(empty,mutex); // 同时申请一个空缓冲区和临界资源使用权 12 buffer(in):=nextp; 13 in:=(in+1)mod n; 14 Ssignal(mutex,full); // 同时释放一个临界资源和满缓冲区 15 until false 16 end 17 consumer:begin 18 repeat 19 Swait(full,mutex); 20 Nextc:=buffer(out); 21 Out:=(out+1)mod n; 22 Ssignal(mutex,empty); 23 consumer the item in nextc; 24 until false; 25 end 26 parend 27 end