当前位置: 代码迷 >> 综合 >> OS学习笔记——生产者消费者问题
  详细解决方案

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

热度:46   发布时间:2024-01-19 14:25:23.0

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

  相关解决方案