news 2026/7/1 23:44:51

std::condition_variable

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 原生的条件变量方法一样。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 23:40:41

API测试报告一键生成实战:从工具选型到CI/CD集成

1. 项目概述&#xff1a;为什么我们需要“一键生成”API测试报告&#xff1f;在软件开发和DevOps流程里&#xff0c;API测试是确保服务稳定性和数据准确性的关键环节。但很多团队&#xff0c;尤其是中小型团队或快速迭代的初创项目&#xff0c;常常面临一个尴尬的局面&#xff…

作者头像 李华
网站建设 2026/7/1 23:40:07

Anthropic新协议:AI中间层归零与结构化输出革命

1. 项目概述&#xff1a;这不是一次普通更新&#xff0c;而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出来&#xff0c;我正在调试一个Claude调用链的终端窗口就停住了。不是因为震惊&#xff0c;而是因为熟悉&am…

作者头像 李华
网站建设 2026/7/1 23:40:04

Claude语义压缩层蒸发:大模型可控性向外部验证迁移

1. 项目概述&#xff1a;这不是一次普通更新&#xff0c;而是一次架构级“蒸发” “Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出现&#xff0c;我在 Slack 群里就看到三位同行同时发了同一个表情&#xff1a;一个倒计时归零的数字“0”…

作者头像 李华
网站建设 2026/7/1 23:38:04

深度解析:Silk-V3-Decoder如何实现微信QQ语音格式的精准解码

深度解析&#xff1a;Silk-V3-Decoder如何实现微信QQ语音格式的精准解码 【免费下载链接】silk-v3-decoder [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to other format (like mp3). Batch conversion support…

作者头像 李华
网站建设 2026/7/1 23:37:42

Structured Outputs与LangGraph:构建高确定性NLP系统

1. 这不是又一篇“AI新功能速览”&#xff0c;而是一份实操级技术拆解手记我做NLP系统架构和Agent工程落地已经十年&#xff0c;从早期用CRF做命名实体识别&#xff0c;到后来搭BERT微调流水线&#xff0c;再到这两年带团队跑通上百个生产级LangChain应用——LAI #77这期内容我…

作者头像 李华