当前位置: 首页 > news >正文

c++使用条件变量实现生产消费问题(跨平台)

1. 生产者线程


思路:队列满了的情况下, 触发条件变量wait, 等待消费线程消费后唤醒继续生产.

void ProducerThreadFunc()
{while(1) {            while(/* 容器已满 */) {      /* 线程等待, 直到消费者消费后唤醒继续执行 */      }/* 生产动作 */   }   
}

2. 消费者线程


思路: 队列中没有元素可以被消费的情况下, 触发条件变量wait, 等待生产线程生产元素之后唤醒继续消费.

// 伪代码
void ConsumerThreadFunc()
{while(1) {            while(/* 容器为空 */) {          /* 线程等待, 直到生产者生产后唤醒继续执行 */    }/* 消费动作 */        }        
}

3. 完整代码


#include <iostream>#include <vector>
#include <condition_variable>
#include <mutex>
#include <thread>
#ifdef __linux__
#include <unistd.h>
#else
#include <windows.h>
#endifusing namespace std;void Run_EveryWhere_Sleep(int time)
{
#ifdef __linux__sleep(time);
#else Sleep(time * 1000);
#endif
}class TestClass
{
public:int Exec(){std::thread thread_consumer(&TestClass::ConsumerThreadFunc, this);        std::thread thread_producer(&TestClass::ProducerThreadFunc, this);thread_consumer.join();thread_producer.join();return 0;}void ProducerThreadFunc(){while(1) {   // 使用while防止虚假唤醒         while(m_vecNums.size() >= 10) {      std::cout << "Producer Thread Wait, Current Size = " << m_vecNums.size() << endl;      unique_lock<std::mutex> locker(m_mutex);m_cv.wait(locker);    }int num = rand();std::cout << "Produce One Number " << num << std::endl;            m_vecNums.emplace_back(num);m_cv.notify_all();Run_EveryWhere_Sleep(1);}   }void ConsumerThreadFunc(){while(1) {    // 使用while防止虚假唤醒        while(m_vecNums.size() <= 0) {      std::cout << "Consumer Thread Wait, Current Size = " << m_vecNums.size() << endl;      unique_lock<std::mutex> locker(m_mutex);m_cv.wait(locker);    }std::cout << "Consume One Number " << m_vecNums[m_vecNums.size() - 1] << std::endl;m_vecNums.pop_back();m_cv.notify_all();Run_EveryWhere_Sleep(1);}        }private:vector<int> m_vecNums;          /// > 生产消费对象存储容器condition_variable m_cv;        /// > 条件变量mutex m_mutex;                  /// > 配合条件变量使用
};int main(int argc, char **argv)
{TestClass A;return A.Exec();
}

4. 执行效果


[root@localhost condition_var_test]# g++ main.cpp -lpthread
[root@localhost condition_var_test]# ./a.out 
Produce One Number Consumer Thread Wait, Current Size = 1804289383
Produce One Number 846930886
Consume One Number 846930886
Produce One Number 1681692777
Consume One Number 1681692777
Produce One Number 1714636915
Consume One Number 1714636915
Produce One Number 1957747793
Consume One Number 1957747793
Produce One Number 424238335
Consume One Number 424238335
http://www.lryc.cn/news/113854.html

相关文章:

  • 怎么快速搭建BI?奥威BI系统做出了表率
  • Kafka3.4 SASL/kerberos/ACL 证以及 SSL 加密连接
  • UE中低延时播放RTSP监控视频解决方案
  • iOS - 开发者账号续订会员资格更换订阅的账号
  • 大数据课程F3——HIve的基本操作
  • top解析
  • 如何让子组件,router-view,呈现左右分布格局
  • 计算机网络—TCP和UDP、输入url之后显示主页过程、TCP三次握手和四次挥手
  • 使用反汇编工具IDA查看发生异常的汇编代码的上下文去辅助分析C++软件异常
  • 怎么合并多个视频?简单视频合并方法分享
  • webpack基础知识九:如何提高webpack的构建速度?
  • 批量改名字序号和前缀
  • 基于Spring Boot的医院预约挂号网站设计与实现(Java+spring boot+MySQL)
  • Linux命令200例:join将两个文件按照指定的键连接起来分析
  • 谈谈网络安全
  • 机器学习深度学习——文本预处理
  • Qt实现可伸缩的侧边工具栏(鼠标悬浮控制伸缩栏)
  • 【Spring Boot】拦截器与统一功能处理
  • RabbitMQ的6种工作模式
  • MFC第二十六天 CRgn类简介与开发、封装CMemoryDC类并应用开发
  • 解决VScode远程服务器时opencv和matplotlib无法直接显示图像的问题
  • 支付模块功能实现(小兔鲜儿)【Vue3】
  • php meilisearch demo
  • 芒格之道——查理·芒格股东会讲话1987-2022
  • 如何运营手游联运平台游戏?
  • vscode连接远程Linux服务器
  • numpy 转换成 cupy 利用GPU执行 错误
  • 力扣:55. 跳跃游戏(Python3)
  • Unity 编辑器资源导入处理函数 OnPreprocessAudio :深入解析与实用案例
  • mongodb-win32-x86_64-2008plus-3.4.24-signed.msi