news 2026/8/22 3:36:06

深入理解 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/8/21 8:22:00

R与Python数据库连接实战(高频问题+5种解决方案全收录)

第一章:R与Python数据库交互概述在数据科学和分析领域,R 与 Python 是两种广泛使用的编程语言。它们各自拥有强大的生态系统,支持从数据清洗、建模到可视化的完整流程。随着项目复杂度的提升,直接操作数据库成为常态,因…

作者头像 李华
网站建设 2026/8/21 15:11:41

Worker 线程中的 函数序列化 模式

工作者线程也可以利用函数序列化来初始化行内脚本。因为函数的toString()方法会返回函数代码的字符串,而函数可以在父上下文中定义但在子上下文中执行。什么是函数序列化?函数序列化是将函数(包括其代码、闭包环境等信息)转换为可…

作者头像 李华
网站建设 2026/8/21 19:42:29

Dify与Spring AI模型通信失败?90%的人都忽略了这4个配置细节

第一章:Dify 与 Spring AI 模型对接概述在现代企业级应用开发中,将 AI 能力集成到后端服务已成为提升智能化水平的关键路径。Dify 作为一款支持可视化编排和模型管理的 AI 应用开发平台,提供了标准化的 API 接口,便于与基于 Sprin…

作者头像 李华
网站建设 2026/8/22 2:19:54

Git下载TensorRT官方Demo并修改适配自定义模型

Git下载TensorRT官方Demo并修改适配自定义模型 在AI模型从实验室走向生产线的过程中,一个常见的困境是:训练时精度高达95%的图像分类模型,部署后推理速度却只有每秒5帧,根本无法满足实时视频流处理的需求。这正是许多工程师在边缘…

作者头像 李华
网站建设 2026/8/19 15:34:05

堆与优先级队列:算法高效利器

堆(heap)实际就是完全二叉树,但他的结点的值有两种趋势,一是从根节点的值到叶子节点的值从小到大称为小根堆,从根节点的值从大到小称为大根堆,否则不是堆。当堆中插入数据或删除数据时,有向上调整算法和向下调整算法。…

作者头像 李华
网站建设 2026/8/21 4:16:59

2026年,高科技制造行业CRM平台全景解析

一、行业特点与 CRM 需求1. 核心业务特性销售周期长:从需求确认到交付可达数月至数年决策链复杂:涉及技术、采购、财务、高层等多部门审批高度定制化:产品规格、技术参数需深度定制,报价复杂技术驱动:客户需求常需转化…

作者头像 李华