缓冲区大小为k
semaphore mutex=1;//in,out的互斥变量
semaphore empty=k; //可用的缓冲区大小
semaphore full=0; //已占用的缓冲区的大小
semaphore buff[k];//缓冲区
int in=0, out=0;// 写 读指针
producer(){
while(true){
p(empty);
p(mutex);//进入临界区
input->buff[in];
in=(in+1)%k;
v(mutex);//出临界区
v(full);
}
}
consumer(){
while(true){
p(full);
p(mutex);
take from buff[out];
out=(out+1)%k;
v(mutex);
v(empty);
}
}
p(empty)和p(mutex)不可以互换,如果互换,当empty=0,先p(mutex),再p(empty),进程会进入阻塞,由于没有释放mutex,使消费者也处于阻塞状态。
可以用一句话理解。当缓冲区没地方的时候,不能让他再获得使用缓冲区的权利。
其实mutex是为了消费者和消费者 , 生产者和生产者之间的互斥,因此可以使用两个mutex1, mutex2使并发程度更高一些。