PV原理操作之生产者消费者

缓冲区大小为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使并发程度更高一些。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章