当前位置: 首页 > 编程笔记 >

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

施选
2023-03-14
本文向大家介绍使用信号量的生产者消费者问题,包括了使用信号量的生产者消费者问题的使用技巧和注意事项,需要的朋友参考一下

生产者消费者问题是同步问题。有一个固定大小的缓冲区,生产者生产商品并将其输入缓冲区。消费者从缓冲区中删除项目并消费它们。

当消费者从缓冲区中消费商品时,生产者不应将商品生产到缓冲区中,反之亦然。因此,缓冲区只能一次由生产者或使用者访问。

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

生产者过程

下面给出了定义生产者流程的代码-

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

} while(1);

在上面的代码中,互斥,空和满是信号量。此处互斥锁初始化为1,empty初始化为n(缓冲区的最大大小),full初始化为0。

互斥信号量确保相互排斥。空和满信号量计算缓冲区中的空和满空间数量。

物料生产后,对空物料进行等待操作。这表明缓冲区中的空白空间已减少了1。然后对互斥量执行等待操作,以使使用者进程不会受到干扰。

将项目放入缓冲区后,对互斥锁和满载进行信号操作。前者指示使用者进程现在可以执行,而后者指示缓冲区已满1。

消费者流程

下面给出了定义使用者流程的代码:

do {

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

等待操作完全执行。这表明缓冲区中的项减少了1。然后对互斥量执行等待操作,以使生产者过程不会干扰。

然后将该项目从缓冲区中删除。之后,对互斥锁和空寄存器执行信号操作。前者指示使用者进程现在可以起作用,而后者指示缓冲区中的空白空间增加了1。

 类似资料:
  • 问题内容: 我需要编写一个类似于生产者- 消费者的问题,必须使用信号量。我尝试了几种解决方案,但都无济于事。首先,我在Wikipedia上尝试了一个解决方案,但没有成功。我当前的代码是这样的: 使用者的方法运行: 生产者的方法运行: 在上面的代码中,发生了一个消费者线程读取一个位置,然后另一个线程读取了相同位置而没有生产者填充该位置的情况,如下所示: 问题答案: 似乎您使用的是互斥锁而不是信号灯?

  • 我应该在两个子进程中获得信号量ID…还是缺少其他东西。

  • 所谓的生产者消费者模型就是 某个模块(函数)负责生产数据,这些数据由另一个模块来负责处理 一般生产者消费者模型包含三个部分 生产者、缓冲区、消费者 为什么生产者消费者模型要含三个部分?直接生产和消费不行么? 一个案例说明一切 生产者好比现实生活中的某个人 缓冲区好比现实生活中的邮箱 消费者好比现实生活中的邮递员 如果只有生产者和消费者, 那么相当于只有写信的人和邮递员,那么如果将来过去的邮递员离职

  • 我有一个消费者作为生产者消费者模式的一部分: 简化: 如果我移除 通过将线程设置为睡眠,CPU使用率攀升到极高的水平(13%),而不是0%。 此外,如果我实例化该类的多个实例,则每个实例的CPU使用率都会以13%的增量攀升。 大约每分钟(可能每30秒)都会向BlockingCollection添加一个新的LogItem,并将适用的消息写入文件。 有没有可能线程以某种方式阻止了其他线程的运行,而系统

  • 我正在编写一个程序,其中几个生产者生成一些应该由几个消费者处理的数据。由于每条数据的消耗大约需要100ms,而目标平台有很多处理器,所以在我看来,每个生产者和每个消费者都得到自己的线程似乎是很自然的。我的问题是:Qt信号/插槽是将数据块从生产者传递到消费者的好方法吗?还是建议更好的解决方案(强烈首选Qt)。 为了防患于未然,制作者每小时产生几十万个数据。

  • 我如何将电话限制在每5秒一次。注意:只能修改reallySlowApi。 编辑:我知道,但是如果Api变得更慢,它就不能解决问题。我需要使用的最佳方式。