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

详细介绍一下C++多线程同步之条件变量的典型用法

C 多线程同步条件变量std::condition_variable详细用法 完整示例这是 C11 原生多线程最常用、最高效的同步机制专门解决线程需要等待某个条件满足才能继续执行的场景。一、核心概念必须懂1. 作用让线程阻塞等待直到其他线程通知它条件已成立再唤醒继续运行。不浪费 CPU不会死循环空转精准控制线程执行顺序用于生产者 - 消费者、线程池、数据就绪通知等2. 三剑客固定搭配std::mutex互斥锁保护共享数据std::condition_variable条件变量等待 / 唤醒共享条件bool / 队列 / 计数判断是否要等待3. 核心 API表格函数作用wait(lock, predicate)阻塞等待自动解锁被唤醒后重新加锁并检查条件notify_one()唤醒一个正在等待的线程notify_all()唤醒所有正在等待的线程二、最重要规则必看wait必须搭配std::unique_lock不能用lock_guard必须带判断条件防止虚假唤醒修改共享条件时必须加锁唤醒可以在解锁后执行效率更高三、最经典用法生产者 - 消费者模型这是条件变量面试必考 工程最常用的写法。完整可运行代码cpp运行#include iostream #include thread #include mutex #include condition_variable #include queue using namespace std; // 共享队列 锁 条件变量 queueint g_queue; // 共享数据 mutex g_mtx; // 互斥锁 condition_variable g_cv; // 条件变量 bool g_stop false; // 停止标志 // 生产者往队列放数据 void producer() { for (int i 1; i 5; i) { this_thread::sleep_for(chrono::seconds(1)); // 模拟生产耗时 // 1. 加锁修改共享数据 unique_lockmutex lock(g_mtx); g_queue.push(i); cout [生产] i endl; // 2. 通知消费者有数据了 g_cv.notify_one(); } // 生产结束 lock_guardmutex lock(g_mtx); g_stop true; g_cv.notify_all(); // 唤醒所有等待线程 } // 消费者从队列取数据 void consumer() { while (true) { // 1. 加锁 unique_lockmutex lock(g_mtx); // 2. 等待条件队列不为空 或 停止生产 g_cv.wait(lock, [] { return !g_queue.empty() || g_stop; }); // 3. 被唤醒后判断是否退出 if (g_stop g_queue.empty()) { cout [消费] 队列空退出 endl; break; } // 4. 取数据 int val g_queue.front(); g_queue.pop(); cout [消费] val endl; } } int main() { thread t_pro(producer); thread t_con(consumer); t_pro.join(); t_con.join(); return 0; }运行效果plaintext[生产] 1 [消费] 1 [生产] 2 [消费] 2 [生产] 3 [消费] 3 [生产] 4 [消费] 4 [生产] 5 [消费] 5 [消费] 队列空退出四、wait到底做了什么底层逻辑cpp运行cv.wait(lock, []{ return 条件; });等价于cpp运行while (!条件) { cv.wait(lock); // 阻塞 自动解锁 } // 被唤醒后 → 自动重新加锁等待时释放锁让其他线程能修改数据被唤醒后自动加锁保证操作安全五、另一种经典用法线程执行顺序控制让线程 B必须等线程 A 完成后才能运行。cpp运行#include iostream #include thread #include mutex #include condition_variable using namespace std; mutex mtx; condition_variable cv; bool is_ready false; void threadA() { cout A执行任务... endl; this_thread::sleep_for(chrono::seconds(1)); lock_guardmutex lock(mtx); is_ready true; // 设置条件 cv.notify_one(); // 通知B cout A任务完成通知B endl; } void threadB() { unique_lockmutex lock(mtx); // 等待 is_ready true cv.wait(lock, []{ return is_ready; }); cout B收到通知开始执行 endl; } int main() { thread t1(threadA); thread t2(threadB); t1.join(); t2.join(); return 0; }六、高频面试点1. 什么是虚假唤醒操作系统可能无缘无故唤醒线程所以必须用 while / 判断条件重新检查。2. 为什么必须用 unique_lock因为wait内部需要自动解锁 重新加锁lock_guard不支持动态解锁。3. notify_one 和 notify_all 区别notify_one()唤醒一个等待线程效率高notify_all()唤醒全部用于广播事件七、总结极简记忆条件变量 等待 唤醒必须配合 mutex 共享条件使用wait用unique_lock 条件判断最常用场景生产者 - 消费者核心口诀先锁、再等、后通知

相关文章:

详细介绍一下C++多线程同步之条件变量的典型用法

C 多线程同步:条件变量(std::condition_variable)详细用法 完整示例这是 C11 原生多线程最常用、最高效的同步机制,专门解决:线程需要等待某个条件满足才能继续执行的场景。一、核心概念(必须懂&#xff0…...

Python 测验

Python 测验 引言 Python 作为一种高级编程语言,因其简洁易读、功能强大等特点,在编程领域备受青睐。为了帮助读者检验自己对 Python 的掌握程度,本文特此推出一份 Python 测验。本测验涵盖了 Python 的基础知识、常用库以及高级特性,旨在帮助读者全面了解 Python 的应用…...

2026年4月如何搭建OpenClaw?阿里云9分钟喂饭级指南+大模型APIKey、Skill部署

2026年4月如何搭建OpenClaw?阿里云9分钟喂饭级指南大模型APIKey、Skill部署。OpenClaw是什么?OpenClaw能干什么?OpenClaw怎么部署使用?本文面向零基础用户,完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部…...

2026年4月OpenClaw如何集成?云端4分钟保姆级方法+大模型APIKey、Skill集成

OpenClaw是什么?OpenClaw能干什么?OpenClaw怎么部署使用?本文面向零基础用户,完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部署OpenClaw(Clawdbot)的流程,包含环境配置、服务启动、…...

jarvisoj_level0栈溢出漏洞分析:从危险函数到后门利用的全过程指南

JarvisOJ Level0栈溢出漏洞实战:从危险函数识别到后门利用的深度解析 在二进制安全领域,栈溢出始终是最经典且最具教学价值的漏洞类型之一。今天我们将以JarvisOJ平台的Level0题目为蓝本,完整演示如何从零开始分析一个真实的栈溢出漏洞。不同…...

C++ <algorithm>标准库常用算法

<algorithm> 头文件是 C 标准模板库&#xff08;STL&#xff09;的“军火库”&#xff0c;里面包含了大约 100 多个函数模板。 掌握其中 10-15 个核心算法&#xff0c;就能覆盖 90% 的日常开发需求&#xff0c;让你彻底告别繁琐的手写 for 循环。 为了方便记忆&#xff0…...

Qwen Pixel Art快速上手:3分钟完成Docker部署,5分钟生成第一张可商用像素图

Qwen Pixel Art快速上手&#xff1a;3分钟完成Docker部署&#xff0c;5分钟生成第一张可商用像素图 1. 为什么选择Qwen Pixel Art 如果你需要快速生成高质量的像素艺术图像&#xff0c;Qwen Pixel Art可能是目前最便捷的解决方案。这个基于Qwen-Image-2512模型和Pixel Art Lo…...

暗黑2存档编辑神器:5分钟解锁单机模式的无限可能

暗黑2存档编辑神器&#xff1a;5分钟解锁单机模式的无限可能 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾梦想在暗黑破坏神2中拥有完美的角色&#xff1f;是否厌倦了反复刷装备的枯燥过程&#xff1f;d2s-editor这款…...

如何快速掌握B站视频下载:终极指南解锁4K大会员内容

如何快速掌握B站视频下载&#xff1a;终极指南解锁4K大会员内容 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 想要将B站上的优质视频…...

网盘直链下载助手:八大平台免费高速下载的完整解决方案

网盘直链下载助手&#xff1a;八大平台免费高速下载的完整解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...

从零到一:在RK3588 Android12上实战RTL8723DU WiFi蓝牙双模驱动移植

1. 开篇&#xff1a;为什么需要RTL8723DU驱动移植&#xff1f; 最近在折腾RK3588开发板时&#xff0c;发现原厂Android12系统居然不支持RTL8723DU这个WiFi蓝牙双模模块。这就像买了辆跑车却发现油箱盖打不开——硬件明明在那里&#xff0c;就是用不了。不过别担心&#xff0c;经…...

OpenHRMS企业级人力资源管理系统架构解析与深度指南

OpenHRMS企业级人力资源管理系统架构解析与深度指南 【免费下载链接】OpenHRMS 项目地址: https://gitcode.com/gh_mirrors/op/OpenHRMS OpenHRMS是一款基于Odoo框架构建的开源企业级人力资源管理系统&#xff0c;采用模块化架构设计&#xff0c;为企业提供从员工入职到…...

LaserGRBL激光雕刻软件:从零开始的完整使用指南

LaserGRBL激光雕刻软件&#xff1a;从零开始的完整使用指南 【免费下载链接】LaserGRBL Laser optimized GUI for GRBL 项目地址: https://gitcode.com/gh_mirrors/la/LaserGRBL LaserGRBL是一款专为GRBL控制器设计的激光雕刻软件&#xff0c;它为激光雕刻爱好者提供了一…...

LFM2.5-1.2B-Thinking多模态扩展:结合OpenCV的图像理解应用

LFM2.5-1.2B-Thinking多模态扩展&#xff1a;结合OpenCV的图像理解应用 1. 引言 想象一下&#xff0c;你正在开发一个智能系统&#xff0c;需要让AI理解图片内容并做出智能回应。传统方案要么需要庞大的计算资源&#xff0c;要么效果不尽如人意。现在&#xff0c;有了LFM2.5-…...

Qwen3.5-2B保姆级部署教程:Ubuntu/CentOS系统supervisorctl重启详解

Qwen3.5-2B保姆级部署教程&#xff1a;Ubuntu/CentOS系统supervisorctl重启详解 1. 模型简介 Qwen3.5-2B是阿里云推出的轻量化多模态基础模型&#xff0c;属于Qwen3.5系列的小参数版本&#xff08;20亿参数&#xff09;。该模型主打低功耗、低门槛部署&#xff0c;特别适配端…...

如何在3分钟内完成Windows与Office智能激活:KMS_VL_ALL_AIO完整指南

如何在3分钟内完成Windows与Office智能激活&#xff1a;KMS_VL_ALL_AIO完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾经因为Windows或Office的激活问题而烦恼&#xff1f;当系…...

Linux平台哔哩哔哩客户端终极指南:开源移植与完整功能体验

Linux平台哔哩哔哩客户端终极指南&#xff1a;开源移植与完整功能体验 【免费下载链接】bilibili-linux 基于哔哩哔哩官方客户端移植的Linux版本 支持漫游 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-linux 想在Linux系统上获得与Windows/macOS相同的哔哩哔…...

告别论文格式噩梦:南航学位论文LaTeX模板3步搞定专业排版

告别论文格式噩梦&#xff1a;南航学位论文LaTeX模板3步搞定专业排版 【免费下载链接】nuaathesis LaTeX document class for NUAA, supporting bachelor/master/PH.D thesis in Chinese/English/Japanese. 南航本科、硕士、博士学位论文 LaTeX 模板 项目地址: https://gitco…...

虚拟化对比

虚拟化对比 一、对比 基于物理硬件的虚拟化&#xff0c; VMware基于操作系统 的虚拟划&#xff0c; hyper-v项目VMwarehyper-v基于硬件技术、intel vt-x操作系统、 hyper-v性能优秀性能弱资源预分配动态分配linux 系统友好不友好二、 适用 VMware 适用于通用&#xff0c;对性能…...

如何用paraphrase-multilingual-MiniLM-L12-v2在90天内降低多语言内容处理成本60%

如何用paraphrase-multilingual-MiniLM-L12-v2在90天内降低多语言内容处理成本60% 【免费下载链接】paraphrase-multilingual-MiniLM-L12-v2 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/paraphrase-multilingual-MiniLM-L12-v2 paraphrase-multilingual-…...

【FastAPI】Swagger UI 静态资源本地化部署:从CDN依赖到自给自足

1. 为什么需要本地化部署Swagger UI&#xff1f; 当你用FastAPI开发完一个接口服务&#xff0c;第一件事可能就是打开/docs页面测试接口。但有没有遇到过这种情况&#xff1a;公司内网服务器突然断网&#xff0c;Swagger页面变成空白&#xff1b;或是海外CDN加载缓慢&#xff…...

接收迭代器begin函数的返回值为什么只能是复制

思考&#xff1a;代码为什么编译报错#include <iostream> #include <vector> #include <algorithm>vector<string> v4 {"null", "null", "null", "null", "null"}; fill_n(v4.begin(), 2, "h…...

Universal Manipulation Interface: Bridging the Gap Between Human Demonstrations and Robot Learning

1. 为什么我们需要通用操作接口&#xff1f; 想象一下&#xff0c;你正在教一个完全不懂中文的外国人包饺子。你可以选择两种方式&#xff1a;第一种是让他戴上VR头盔&#xff0c;通过虚拟现实模仿你的动作&#xff1b;第二种是直接让他观察你的手法然后自己尝试。这两种方法听…...

出口欧盟 CE 认证实操干货|避坑指南

对于出口欧盟的产品从业者、外贸技术人员而言&#xff0c;CE认证是产品合规入市的核心前提&#xff0c;也是最易踩坑的环节。多数从业者因混淆CE认证本质、误解合规要求&#xff0c;导致货物被扣、罚款等损失。本文精简核心实操要点&#xff0c;摒弃冗余表述&#xff0c;聚焦CE…...

数据中心光互联的‘隐形守护者’:深入聊聊MEMS光开关在DCI和OXC里的那些实战配置与选型心得

数据中心光互联的‘隐形守护者’&#xff1a;深入聊聊MEMS光开关在DCI和OXC里的那些实战配置与选型心得 在数据中心流量每年以30%以上速度增长的今天&#xff0c;光互联技术正面临前所未有的挑战。作为光网络架构师&#xff0c;我们常常需要在不增加机架空间的前提下&#xff0…...

Trae 深度评测 - 从VSCode迁移者的视角,看AI如何重塑开发工作流

1. 从VSCode到Trae&#xff1a;一个老司机的真实迁移体验 作为一个在VSCode上摸爬滚打5年的老用户&#xff0c;第一次听说Trae时我的反应和大多数人一样&#xff1a;"又一个想挑战VSCode的编辑器&#xff1f;"但当我真正用Trae完成了一个中型前端项目后&#xff0c;这…...

Windows Cleaner:终极C盘空间清理指南,告别系统卡顿与存储危机

Windows Cleaner&#xff1a;终极C盘空间清理指南&#xff0c;告别系统卡顿与存储危机 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否曾因C盘爆红而焦虑&a…...

Kandinsky-5.0-I2V-Lite-5s从零部署:JDK1.8环境下的Java客户端开发

Kandinsky-5.0-I2V-Lite-5s从零部署&#xff1a;JDK1.8环境下的Java客户端开发 1. 引言 还在用JDK1.8开发企业级应用&#xff1f;想集成最新的Kandinsky-5.0-I2V-Lite-5s图像转视频模型却担心兼容性问题&#xff1f;这篇教程就是为你准备的。我们将从零开始&#xff0c;手把手…...

2025物联网通信毕业设计:聚焦LoRa与ZigBee的智慧农业创新应用

1. 为什么选择LoRa与ZigBee做智慧农业&#xff1f; 最近几年帮学生指导毕业设计时&#xff0c;发现越来越多的同学开始关注智慧农业这个方向。说实话&#xff0c;这个选题确实很值得做——既能结合当下热门的物联网技术&#xff0c;又能解决实际农业生产中的痛点。在众多无线通…...

如何用SunnyUI快速构建现代化WinForm应用:终极C界面开发指南

如何用SunnyUI快速构建现代化WinForm应用&#xff1a;终极C#界面开发指南 【免费下载链接】SunnyUI SunnyUI.NET 是基于.NET Framework 4.0、.NET6、.NET8、.NET9 框架的 C# WinForm UI、开源控件库、工具类库、扩展类库、多页面开发框架。 项目地址: https://gitcode.com/gh…...