如何通过条件变量实现生产消费者模式

C++

方式/步调

  1. 1

    起首实现出产者,界说出产者的函数,接管到数据放入队列之后,挪用notify_one函数来通知消费者处置

    267f9e2f070828388b239ec1b699a9014c08f13d.jpg
  2. 2

    接实在现消费者函数,挪用函数wait期待接管旌旗灯号,若是接管到旌旗灯号,那么从队列中掏出数据然后处置,这里需要注重的是掏出数据之后,可以提前解锁,以便出产者可以或许尽快处置数据

    e7cd7b899e510fb36e1a3542d733c895d0430ce7.jpg
  3. 3

    最后别忘了在类的私有属性中界说线程锁、队列以及前提变量

    314e251f95cad1c893cdbef2713e6709c83d51f4.jpg
  4. 4

    完当作上面的步调之后,接下来就看下若何利用。起首经由过程线程的体例启动出产者,休眠一段时候后,再经由过程线程的体例启动消费者

    0824ab18972bd4076974912875899e510eb309b7.jpg
  5. 5

    调试运行的成果如下所示,这个申明先启动出产者再启动消费者,消费者也可以或许当作功处置出产者出产的数据

    77094b36acaf2edd51130b3c831001e938019301.jpg
  6. 6

    先启动消费者,休眠一段时候,再启动出产者

    d1a20cf431adcbef98ec3cd3a2af2edda2cc9f0f.jpg
  7. 7

    从输出成果信息看,消费者和出产者是瓜代处置的,而且消费者与出产者的处置是一一对应的

    d0c8a786c9177f3e512cb1d87ecf3bc79e3d56ce.jpg
  8. 8

    最后再总体看下出产消费者模式,这里需要注重的是消费者中挪用wait函数,需要添加匿名函数,匿名函数是判定队列是否为空,若是不为空,才继续往下处置数据,若是为空,那么继续wait,   这样做的原因是wait返回有可能不是因为接管到出产者发送的旌旗灯号

    37d12f2eb9389b50b1abad878b35e5dde6116e8b.jpg
  • 发表于 2019-08-07 00:17
  • 阅读 ( 844 )
  • 分类:其他类型

0 条评论

请先 登录 后评论
联系我们:uytrv@hotmail.com 问答工具