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

1 、利用记录型信号量解决生产者——消费者问题spa

假定在生产者和消费者之间的公用缓冲池,具备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

二、利用AND信号量解决生产者——消费者问题(看懂了上面的详细分析,下面的伪代码就容易理解多了)code

 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
相关文章
相关标签/搜索