用记录型信号量解决生产者-消费者问题

 1   int in = 0, out = 0;//in: 输入指针, out: 输出指针;
 2   item buffer[n];//n个缓冲区组成的数组;
 3   semaphore mutex = 1, full = 0, empty = n;
 4   //mutex: 互斥信号量, 生产者进程和消费者进程都只能互斥访问缓冲区;
 5   //full: 资源信号量, 满缓冲区的数量;
 6   //empty: 资源信号量, 空缓冲区的数量;//信号量不允许直接参与运算, 故都要定义;
 7   
 8   //生产者程序;
 9   void Producer() {
10    do {
11        生产者生产一个产品nextp;
12        wait(empty);//申请一个空缓冲区;
13        wait(mutex);//申请临界资源;
14        buffer[in] = nextp;//将产品添加到缓冲区;
15        in = (in + 1) % n;//类似于循环队列;
16        signal(mutex);//释放临界资源;
17        signal(full);//释放一个满缓冲区;
18    } while (TRUE);
19  }
20  
21  //消费者程序;
22  void Consumer() {
23    do {
24        wait(full);//申请一个满缓冲区;
25        wait(mutex);//申请临界资源;
26        nextc = buffer[out];//将产品从缓冲区取出;
27        out = (out + 1) % n;//类似于循环队列;
28        signal(mutex);//释放临界资源;
29        signal(empty);//释放一个空缓冲区;
30        消费者将一个产品nextc消费; 
31   } while (TRUE);
32  
33    void main(){
34      cobegin
35              Producer();
36              Consumer();
37      coend
38  
39  }  
40  
41 }

猜你喜欢

转载自www.cnblogs.com/wangjiaolong/p/12129434.html