来之google 收索结果
f ull 和 empty 。信号量mutex作为互斥信号量,它用于控制互斥访问缓冲池,互斥信号量初值为 1;
信号量 full 用于记录当前缓冲池中“满”缓冲区数,初值为0。信号量 empty 用于记录当前缓冲池中“空”缓冲区数,初值为n。
新的数据添加到缓存中后,full 在增加,而 empty 则减少。如果生产者试图在 empty 为0时减少其值,生产者就会被“催眠”。
下一轮中有数据被消费掉时,empty就会增加,生产者就会被“唤醒”。
semaphore mutex=1; //临界区互斥信号量 semaphore empty=n; //空闲缓冲区 semaphore full=0; //缓冲区初始化为空 producer ()//生产者进程 { while(1) { produce an item in nextp; //生产数据 P(empty); //获取空缓冲区单元 P(mutex); //进入临界区. add nextp to buffer; //将数据放入缓冲区 V(mutex); //离开临界区,释放互斥信号量 V(full); //满缓冲区数加1 } } consumer ()//消费者进程 { while(1) { P(full); //获取满缓冲区单元 P(mutex); // 进入临界区 remove an item from buffer; //从缓冲区中取出数据 V (mutex); //离开临界区,释放互斥信号量 V (empty) ; //空缓冲区数加1 consume the item; //消费数据 } }
items代表缓冲区可使用的资源数,space代表缓冲区可用资源数
mutex表示互斥锁
buf[10]代表缓冲区,内容类型为item
in、out代表第一个资源和最后一个资源(i即in最早产生的资源)
var items=0,sapce=10,mutex=1; var in=0,out=0; item buf[10]={ NULL}; producer{ while(true){ P(space);//等待缓冲区有空闲位置,在使用PV操作时,条件变量需要在互斥锁之前 P(mutex);//保证在product时不会有其他进程访问缓冲区 //product buf.push(item,in); //将新资源放到buf[in]位置 in=(in+1)%10; V(mutex); V(items); } } consumer{ while(true){ P(items); //等待缓冲区有资源可以使用 P(mutex); //保证在consume时不会有其他线程访问缓冲区 //consume buf.pop(out); //将buf[out]位置的资源取走 out=(out+1)%10; V(mutex); V(space); } }