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

来源:互联网 发布:大学数据库课程设计 编辑:程序博客网 时间:2024/04/26 08:29

缓冲池是临界资源,因此需要为其设置一个互斥信号量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);}}

原创粉丝点击