经典进程的同步问题之——生产者&&消费者

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

 

posted @ 2018-08-13 10:35  JiangXiaoKun  阅读(1099)  评论(0编辑  收藏  举报