news 2026/6/10 16:13:02

深入理解 Linux 线程同步:条件变量 (Condition Variable)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入理解 Linux 线程同步:条件变量 (Condition Variable)

各类资料学习下载合集
链接:https://pan.quark.cn/s/b0a2f36933de

在多线程编程中,互斥锁(Mutex)很好地解决了“谁能动数据”的问题(互斥),但它解决不了“什么时候动数据”的问题(同步)。

比如经典的生产者-消费者模型:消费者需要等生产者生产出数据才能消费。如果只用互斥锁,消费者就得不断轮询(Polling)检查数据,这极其浪费 CPU 资源。

这时候,条件变量(Condition Variable)就登场了。它不是锁,但它能让线程“乖乖睡觉”,直到收到“条件满足”的通知。


一、 什么是条件变量?

本质特性

  • 它不是锁:条件变量本身不具备保护数据的功能。
  • 配合互斥锁使用:它必须和互斥锁搭档,互斥锁保护共享数据,条件变量负责让线程阻塞等待。
  • 核心功能:提供一个“线程休息室”。当条件不满足时(比如没有数据),线程在这里阻塞;当条件满足时(数据来了),线程被唤醒。

二、 核心操作函数详解

1. 初始化与销毁

条件变量和互斥锁一样,支持静态和动态两种初始化方式。

  • 静态初始化
    pthread_cond_tcond=PTHREAD_COND_INITIALIZER;
  • 动态初始化
    intpthread_cond_init(pthread_cond_t*cond,constpthread_condattr_t*attr);// attr 通常传 NULL 使用默认属性
  • 销毁
    intpthread_cond_destroy(pthread_cond_t*cond);

2. 阻塞等待:pthread_cond_wait(重难点)

这是条件变量最复杂、也是最重要的函数。

intpthread_cond_wait(pthread_cond_t*cond,pthread_mutex_t*mutex);

它的“三重作用”(必须背诵):

  1. 阻塞等待:将当前线程放入条件变量的等待队列中,进入阻塞状态。
  2. 解锁原子性地释放传入的互斥锁(mutex)。
    • 注意:步骤 1 和 2 是原子操作,不可分割,确保在进入等待状态前不会丢失信号。
  3. 重新加锁:当线程被唤醒(返回)时,它会自动重新去抢那把互斥锁。如果抢到了,函数返回;没抢到,继续阻塞在锁上。

使用范式
调用wait前,当前线程必须已经持有了互斥锁。

3. 唤醒机制:signalvsbroadcast

  • pthread_cond_signal(pthread_cond_t *cond)
    • 设计意图:唤醒等待队列中的至少一个线程。
    • 实际情况:虽然标准说是唤醒一个,但在某些实现中可能会唤醒多个(虚假唤醒),所以代码中通常用while循环检查条件。
  • pthread_cond_broadcast(pthread_cond_t *cond)
    • 设计意图:唤醒等待队列中的所有线程。
    • 警惕:如果唤醒了大量线程去抢同一把锁,会造成“惊群效应”(Thundering Herd),影响性能。

三、 代码实战:生产者-消费者模型

为了演示条件变量的用法

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

普通耳机秒变AI翻译神器!谷歌Gemini加持,实时翻译还能传情绪

对经常跨国出行、追外语影视的数码爱好者来说,谷歌刚推出的耳机实时翻译测试版,绝对是年末最值得期待的黑科技。12 月 14 日消息,谷歌正式为安卓版谷歌翻译上线这一功能,不用专门买翻译耳机,只要打开 App 连接任意耳机…

作者头像 李华
网站建设 2026/6/10 9:22:52

用C# WinForm打造MES管理系统:从通讯到生产管理的实现

C#开发MES系统程序源码 c#winform MES管理系统源码1.该系统用C#.net开发,与7台西门子plc以太网通讯,生产数据收集,设备状态显示,生产管理等在工业4.0的浪潮下,MES(制造执行系统)成为企业实现智能…

作者头像 李华
网站建设 2026/6/10 10:55:41

异常频发怎么办?,一文读懂Dify与Spring AI协同容错设计精髓

第一章:异常频发怎么办?——Dify与Spring AI协同容错设计概述在构建基于AI服务的现代应用时,异常响应、网络波动和模型超时等问题频繁出现。Dify作为低代码AI编排平台,与Spring AI框架深度集成后,需具备强健的容错能力…

作者头像 李华
网站建设 2026/6/10 10:53:11

Datawhale Hello-Agents入门篇202512第1次作业

作业 首先,确保你的电脑上已经安装了必要的库: pip install requests python-dotenv tavily-python openai python-dotenv 用于读取 .env 环境变量文件其他库是原代码中已用到的(网络请求、Tavily 搜索、OpenAI 兼容客户端) 1…

作者头像 李华
网站建设 2026/6/10 10:53:55

震惊!想知道专业宠物美容培训学校哪家好?看这就够了!

震惊!想知道专业宠物美容培训学校哪家好?看这就够了!在宠物行业蓬勃发展的当下,宠物美容师成为了备受关注的职业。专业的宠物美容不仅能提升宠物的外观形象,还对宠物的健康有着重要意义。那么,专业宠物美容…

作者头像 李华