OS学习笔记——生产者消费者问题

缓冲池是临界资源,因此需要为其设置一个互斥信号量mutex。此外,为了让生产者和消费者都能正确使用空、满缓冲区,还需要设置两个资源信号量empty和full,empty和full的初值分别为n和0. 在进程选择缓冲区时,还需要使用两个特殊指针in和out,分别指向生产者使用的空缓冲区和消费者使用的满缓冲区。每当in或out当前指向的缓冲区被生产者或消费者使用之后,需要后移一个缓冲区。

semaphore mutex = 1;
semaphore full = 0;
semaphore empty = n;
buffType buffer[n];

Producer(){
	bufType *next,*in;
	while(TRUE){
		produceItem(next);
		P(empty);//申请一个空缓冲区
		P(mutex);//为缓冲池加锁,使其他进程无法对其中任一缓冲区进行操作
		copyBuffer(next,in);//将next缓冲区的数据copy到in所指向的公共空缓冲区
		in = (in + 1) % n;
		V(mutex);
		V(full);//释放已经装满数据的满缓冲区,V操作使得满缓冲区数量增加1,如果找不到满缓冲区
			//而被阻塞的消费者时,该操作还会唤醒它。
	}
}

Producer(){
	bufType *next,*out;
	while(TRUE){
		P(full);
		P(mutex);//为缓冲池加锁,使其他进程无法对其中任一缓冲区进行操作
		copyBuffer(out,next);//将next缓冲区的数据copy到in所指向的公共空缓冲区
		out = (out + 1) % n;
		V(mutex);
		V(empty);
		consumeItem(next);
	}
}

猜你喜欢

转载自blog.csdn.net/Serenity0614/article/details/78765651
今日推荐