当前位置:   article > 正文

C++ 多线程 生产者消费者(1)_std::queue 生产消费

std::queue 生产消费
  1. #include <queue>
  2. #include <thread>
  3. #include <mutex>
  4. #include <iostream>
  5. #include <vector>
  6. #include <unistd.h>
  7. std::queue<std::string> mQueue;
  8. std::mutex m;
  9. std::condition_variable cv_notEmpty;
  10. void workerPut(int max_num, int interval=1){
  11. for(int i=0;i<max_num;i++){
  12. sleep(interval);
  13. std::unique_lock<std::mutex> lk_queue(m);
  14. mQueue.push("JobItem " + std::to_string(i));
  15. std::cout << "put value to queue: " << i << std::endl;
  16. cv_notEmpty.notify_all();
  17. }
  18. }
  19. void workShow(int interval=2){
  20. while(true){
  21. sleep(interval);
  22. std::unique_lock<std::mutex> lk_queue(m);
  23. cv_notEmpty.wait(lk_queue,[]{return !mQueue.empty();});
  24. std::string value = mQueue.front();
  25. mQueue.pop();
  26. std::cout << "consume value: " + value << std::endl;
  27. }
  28. }
  29. int main(){
  30. std::thread producer(workerPut,10,1);
  31. std::thread consumer(workShow,2);
  32. producer.join();
  33. consumer.join();
  34. return 0;
  35. }

上面有个限制:

(1)生产者生产max_num个产品就退出;

(2)对队列上线没有做要求。

下面继续改进,

(1)生产者可以一直生产产品放到队列;

(2)设置队列最大长度,即队列满了则生产者要被阻塞等待;等待消费者消费了数据,队列有空余,再进行生产;

(3)消费者当队列不空时消费产品

  1. #include <queue>
  2. #include <thread>
  3. #include <mutex>
  4. #include <iostream>
  5. #include <vector>
  6. #include <unistd.h>
  7. std::queue<std::string> mQueue;
  8. std::mutex m;
  9. std::condition_variable cv_notEmpty;
  10. std::condition_variable cv_notFull;
  11. void workerPut(int max_num, int interval=1){
  12. int i = 0;
  13. while(true){
  14. sleep(interval);
  15. std::unique_lock<std::mutex> lk_queue(m);
  16. cv_notFull.wait(lk_queue, []{return mQueue.size()<5;}); // queue最长5
  17. mQueue.push("JobItem " + std::to_string(i));
  18. std::cout << "put value to queue: " << i << std::endl;
  19. std::cout << "current queue is : " << mQueue.size() << std::endl;
  20. cv_notEmpty.notify_all();
  21. i++;
  22. }
  23. }
  24. void workShow(int interval=2){
  25. while(true){
  26. sleep(interval);
  27. std::unique_lock<std::mutex> lk_queue(m);
  28. cv_notEmpty.wait(lk_queue,[]{return !mQueue.empty();});
  29. std::string value = mQueue.front();
  30. mQueue.pop();
  31. std::cout << "consume value: " + value << std::endl;
  32. std::cout << "current queue is : " << mQueue.size() << std::endl;
  33. cv_notFull.notify_all();
  34. }
  35. }
  36. int main(){
  37. std::thread producer(workerPut,10,1);
  38. std::thread consumer(workShow,2);
  39. producer.join();
  40. consumer.join();
  41. return 0;
  42. }

由于设置了队列最长为5,而且生产速度是消费速度的2倍,因此最终队列长度会一直保持在5


​​​​​​​

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/267904
推荐阅读
相关标签
  

闽ICP备14008679号