• <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>

    如何通過條件變量實現生產消費者模式

    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
    • 閱讀 ( 841 )
    • 分類:其他類型

    0 條評論

    請先 登錄 后評論
    聯系我們:uytrv@hotmail.com 問答工具
  • <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>
    久久久久精品国产麻豆