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

std::condition_variable

C++ 11 提供了std::condition_variable这个类代表条件变量,与 Linux 系统原生的条件变量一样,同时提供了等待条件变量满足的wait系列方法(wait、wait_for、wait_until 方法),发送条件信号使用notify方法(notify_onenotify_all方法),当然使用std::condition_variable对象时需要绑定一个std::unique_lockstd::lock_guard对象。

C++ 11 中 std::condition_variable 不再需要显式调用方法初始化和销毁。

我们将上文中介绍 Linux 条件变量的例子改写成 C++ 11 版本:

#include <thread> #include <mutex> #include <condition_variable> #include <list> #include <iostream> class Task { public: Task(int taskID) { this->taskID = taskID; } void doTask() { std::cout << "handle a task, taskID: " << taskID << ", threadID: " << std::this_thread::get_id() << std::endl; } private: int taskID; }; std::mutex mymutex; std::list<Task*> tasks; std::condition_variable mycv; void* consumer_thread() { Task* pTask = NULL; while (true) { std::unique_lock<std::mutex> guard(mymutex); while (tasks.empty()) { //如果获得了互斥锁,但是条件不合适的话,pthread_cond_wait会释放锁,不往下执行。 //当发生变化后,条件合适,pthread_cond_wait将直接获得锁。 mycv.wait(guard); } pTask = tasks.front(); tasks.pop_front(); if (pTask == NULL) continue; pTask->doTask(); delete pTask; pTask = NULL; } return NULL; } void* producer_thread() { int taskID = 0; Task* pTask = NULL; while (true) { pTask = new Task(taskID); //使用括号减小guard锁的作用范围 { std::lock_guard<std::mutex> guard(mymutex); tasks.push_back(pTask); std::cout << "produce a task, taskID: " << taskID << ", threadID: " << std::this_thread::get_id() << std::endl; } //释放信号量,通知消费者线程 mycv.notify_one(); taskID ++; //休眠1秒 std::this_thread::sleep_for(std::chrono::seconds(1)); } return NULL; } int main() { //创建5个消费者线程 std::thread consumer1(consumer_thread); std::thread consumer2(consumer_thread); std::thread consumer3(consumer_thread); std::thread consumer4(consumer_thread); std::thread consumer5(consumer_thread); //创建一个生产者线程 std::thread producer(producer_thread); producer.join(); consumer1.join(); consumer2.join(); consumer3.join(); consumer4.join(); consumer5.join(); return 0; }

编译并执行程序输出结果如下所示:

[root@localhost testmultithread]# g++ -g -o cpp11cv cpp11cv.cpp -std=c++0x -lpthread [root@localhost testmultithread]# ./cpp11cv produce a task, taskID: 0, threadID: 140427590100736 handle a task, taskID: 0, threadID: 140427623671552 produce a task, taskID: 1, threadID: 140427590100736 handle a task, taskID: 1, threadID: 140427632064256 produce a task, taskID: 2, threadID: 140427590100736 handle a task, taskID: 2, threadID: 140427615278848 produce a task, taskID: 3, threadID: 140427590100736 handle a task, taskID: 3, threadID: 140427606886144 produce a task, taskID: 4, threadID: 140427590100736 handle a task, taskID: 4, threadID: 140427598493440 produce a task, taskID: 5, threadID: 140427590100736 handle a task, taskID: 5, threadID: 140427623671552 produce a task, taskID: 6, threadID: 140427590100736 handle a task, taskID: 6, threadID: 140427632064256 produce a task, taskID: 7, threadID: 140427590100736 handle a task, taskID: 7, threadID: 140427615278848 produce a task, taskID: 8, threadID: 140427590100736 handle a task, taskID: 8, threadID: 140427606886144 produce a task, taskID: 9, threadID: 140427590100736 handle a task, taskID: 9, threadID: 140427598493440 ...更多输出结果省略...

需要注意的是,如果在 Linux 平台上,std::condition_variable 也存在虚假唤醒这一现象,如何避免与上文中介绍 Linux 原生的条件变量方法一样。

http://www.gsyq.cn/news/1617507.html

相关文章:

  • .NET MAUI跨平台UI自动化测试实战:Appium环境搭建与POM设计
  • Claude v4语义压缩层蒸发:从可控推理到确定性工程的范式迁移
  • Claude零层架构解析:语义保真度校验环的降维重构
  • 铜钟音乐:终极免费纯净听歌平台完整使用指南 [特殊字符]
  • Mythos大模型能力跃迁与门控释放机制解析
  • MAA明日方舟自动化助手技术指南:图像识别驱动的智能任务管理方案
  • 基于PIC18F46K20的无刷电机FOC控制实现与优化
  • Claude 3.7 Sonnet:面向软件开发的可调控推理模型
  • GPT-4参数量与激活率的真相:1.8万亿不是显存需求,2%不是固定开关
  • Selenium Select类详解:高效处理Web下拉框的三种方法与实战技巧
  • COSP与USP:大模型自我校准的自一致性提示范式
  • RAG信息检索不是搜索平移:语义锚定与生成适配设计
  • GPT-4参数量与激活率真相:1.8万亿不是算力,2%不是固定值
  • 基于Si4732与PIC微控制器的数字收音机系统设计
  • TurboQuant实现KV Cache压缩,22GB显存流畅运行35B大模型
  • DeepSeek V4百万字长文本处理技术解析
  • MATLAB水果蔬菜颜色识别工具:KNN分类+RGB/HSV特征提取
  • Mythos推理图谱:结构化推理如何实现可审计AI决策
  • 深度解析Notepad--插件开发:实战技巧与高效方案
  • 为AI Agent赋予浏览器自动化能力:基于Playwright与MCP协议的实战指南
  • React2Shell漏洞应急:Next.js一键修复工具与安全响应实战
  • RAG四大演进路径:MemoRAG、RAG Agent、RAG Fusion与生产级集成
  • Selenium元素定位实战:从基础到高级的自动化测试核心技能
  • Selenium自动化加载Chrome扩展的完整方案与实战指南
  • 钢带还是钢丝绳?先看底坑和顶层高度再决定
  • gemini : 无法将“gemini“项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案
  • GPT Store本质是提示工程工业化:结构化提示设计范式解析
  • DeepSeek V4开源大模型3090单卡实测:长文本稳定性与中文推理性能深度解析
  • 工程化设计评审助手:让视觉意见变成可执行问题清单
  • Midscene.js实战:基于AI视觉的跨平台自动化测试指南