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

C++条件变量学习

1、概述

你知道条件变量"虚假唤醒"问题么,下面代码有问题么

void CFileTaskThread::Run()
{while (!m_bStop){CFileItemRequest* pFileItem;{std::unique_lock<std::mutex> guard(m_mtItems);if (m_Filelist.empty()){if (m_bStop)return;// 等待条件满足m_cvItems.wait(guard);}pFileItem = m_Filelist.front();m_Filelist.pop_front();}// do something}
}

2、分析

上述代码,当列表 m_Filelist 为空时,调用 wait 进入阻塞状态,等待条件变量被触发。一旦其他线程通过 notify_one() 或 notify_all() 发出通知,wait 函数解除阻塞并返回。随后,从列表头部取出一个任务继续执行。

虚假唤醒:

一个线程正在调用std::condition_variable::wait()等待,没有任何线程调用notify_one()或notify_all情况下,wait函数解除阻塞并返回了。

如果是虚假唤醒场景,那么上述代码就会有问题,当wait函数返回后,准备从列表头部取出一个任务,而此时列表是空的,程序就崩溃了。

正确写法

循环中使用 while 检查条件可以防止虚假唤醒。即使线程被意外唤醒,while 会再次检查列表是否为空。如果列表仍然为空,线程会继续调用 wait 并保持等待状态,直到条件真正满足。

void CFileTaskThread::Run()
{while (!m_bStop){CFileItemRequest* pFileItem;{std::unique_lock<std::mutex> guard(m_mtItems);// 注意注意,这里用whilewhile (m_Filelist.empty()){if (m_bStop)return;// 等待条件满足m_cvItems.wait(guard);}pFileItem = m_Filelist.front();m_Filelist.pop_front();}// do something}
}

学习链接:https://github.com/0voice

http://www.xdnf.cn/news/19668.html

相关文章:

  • UML状态图之trigger(触发器)、guard(守卫条件)和action(动作)
  • Linux 文本处理神器——sed
  • 拔河(蓝桥杯)(前缀和)
  • OpenStack:典型的面向服务架构(Service-Oriented Architecture, SOA)
  • milvus-standalone启动失败unhealthy,错误日志context deadline exceeded
  • 面试官常问:Redis 为什么快?这篇回答满分!
  • 【数据结构探秘】手把手用单链表实现增删查改:一篇面向 C 程序员的实战指南
  • C#枚举类型的定义及其用法
  • WS2812灯带效果设计器上位机
  • 微服务的编程测评系统19-我的消息功能-竞赛排名功能
  • ChartView的基本使用
  • 【学Python自动化】 7.1 Python 与 Rust 输入输出对比学习笔记
  • Linux系统shell脚本(二)
  • 【Python - 基础 - 工具】解决pycharm“No Python interpreter configured for the project”问题
  • 机器学习入门,支持向量机
  • Vite + React + Tailwind v4 正确配置指南(避免掉进 v3 的老坑)
  • 为什么程序员总是发现不了自己的Bug?
  • Flutter 3.35.2 主题颜色设置指南
  • 使用 qmake 生成 Makefile,Makefile 转换为 Qt 的 .pro 文件
  • Redis核心数据类型解析——string篇
  • 基于YOLO8的番茄成熟度检测系统(数据集+源码+文章)
  • 2025年女性最实用的IT行业证书推荐:赋能职业发展的8大选择
  • Elasticsearch面试精讲 Day 5:倒排索引原理与实现
  • IoTDB对比传统数据库的五大核心优势
  • 深度估计:单目视觉实现车距测量和车速估计(含完整项目代码)
  • ubantu20.04 git clone 无法连接问题与解决方法
  • netstat用法
  • 别再让分散 IO 拖慢性能!struct iovec:高效处理聚集 IO 的底层利器
  • pikachu之 unsafe upfileupload (不安全的文件上传漏洞)
  • 力扣hot100:除自身以外数组的乘积(除法思路和左右前缀乘积)(238)