使用信号量的生产者消费者问题


生产者消费者问题是一个同步问题。存在一个固定大小的缓冲区,生产者产生项目并将它们放入缓冲区。消费者从缓冲区中移除项目并消耗它们。

当消费者从缓冲区中消耗项目时,生产者不应该将项目放入缓冲区,反之亦然。因此,缓冲区一次只能被生产者或消费者访问。

生产者消费者问题可以使用信号量来解决。生产者和消费者进程的代码如下所示:

生产者进程

定义生产者进程的代码如下所示:

do {
   .
   . PRODUCE ITEM
   .
   wait(empty);
   wait(mutex);
   .
   . PUT ITEM IN BUFFER
   .
   signal(mutex);
   signal(full);

} while(1);

在上面的代码中,mutex、empty 和 full 是信号量。这里 mutex 初始化为 1,empty 初始化为 n(缓冲区的最大大小),full 初始化为 0。

mutex 信号量确保互斥。empty 和 full 信号量计算缓冲区中空闲空间和已满空间的数量。

在产生项目后,对 empty 进行 wait 操作。这表示缓冲区中的空闲空间减少了 1。然后对 mutex 进行 wait 操作,以便消费者进程无法干扰。

将项目放入缓冲区后,对 mutex 和 full 进行 signal 操作。前者表示消费者进程现在可以执行操作,后者表示缓冲区已满 1。

消费者进程

定义消费者进程的代码如下所示

do {

   wait(full);
   wait(mutex);
   . .
   . REMOVE ITEM FROM BUFFER
   .
   signal(mutex);
   signal(empty);
   .
   . CONSUME ITEM
   .
} while(1);

对 full 进行 wait 操作。这表示缓冲区中的项目减少了 1。然后对 mutex 进行 wait 操作,以便生产者进程无法干扰。

然后从缓冲区中移除项目。之后,对 mutex 和 empty 进行 signal 操作。前者表示消费者进程现在可以执行操作,后者表示缓冲区中的空闲空间增加了 1。

更新于: 2020年6月24日

27K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告