———————————————————————————————————————————————
生产者-消费者问题(Producer-Consumer Problem)是信号量应用的一个实例,也可称之为有界缓冲问题。
问题阐述:
2类进程共享1个公共的固定大小的缓冲区,缓冲区包含N个槽。
一类进程是生产者进程,负责将信息放入缓冲区;另一类是消费者进程,从缓冲区中取信息。
———————————————————————————————————————————————
生产者-消费者问题中用到的3个信号量:full、empty、mutex
full:记录缓冲区中非空的槽数,初始值=0
empty:记录缓冲区中空的槽数,初始值=N
mutex:确保进程不同时访问缓冲区,初始值为1,互斥
***生产者-消费者问题***
#define N 100 //缓冲区的槽数
#define TRUE 1
//信号量定义
Semaphore_t mutex = 1;
empty = N;
full = 0;
//生产者
void producer()
{
while(TRUE){
produce(); //生产一项
P(&empty); //申请一个空槽
P(&mutex); //请求进入临界区
append(); //加入缓冲区
V(&mutex); //离开临界区
V(&full); //递增非空槽
}
}
//消费者
void consumer()
{
while(TRUE){
P(&full); //申请一个非空槽
P(&mutex);
remove(); //从缓冲区移出1项
V(&mutex); //离开临界区
V(&empty); //递增空槽数
consume(); //消费数据
}
}
注意:
每个进程中的多个P操作的出现顺序不能颠倒。通常先执行对资源信号量的P操作,再执行对互斥信号量的P操作,否则可能会引起死锁。在上述问题中,体现为先执行P(&full)/P(&empty),然后再执行P(&mutex)。
P,V操作在很多情况下都是成对出现的。