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

Linux C 条件变量阻塞线程用法:等待时CPU占用率为0

一、核心结论

在 Linux 下,条件变量(pthread_cond)+ 互斥锁是实现「线程阻塞等待变量变化、完全不占用 CPU」的唯一标准方案。线程休眠时不参与调度,CPU 占用为 0;变量变化时可被立即唤醒。


二、核心原理

  1. 阻塞等待

pthread_cond_wait会自动释放锁并让线程进入休眠阻塞态,CPU 占用率 0%。

2.唤醒机制

修改变量后调用pthread_cond_signal,内核立即唤醒等待线程。

3.安全保证

互斥锁保护共享变量,避免多线程竞争与脏读。

4.伪唤醒防护

必须用while循环判断条件,而非if


三、最简可运行 C 代码

#include <stdio.h> #include <pthread.h> #include <unistd.h> // 三要素:锁 + 条件变量 + 等待变量 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; int flag = 0; // 等待线程:阻塞,0 CPU void *wait_task(void *arg) { while (1) { pthread_mutex_lock(&mutex); // 阻塞等待 flag 变为 1 while (flag == 0) { pthread_cond_wait(&cond, &mutex); } // 被唤醒 printf("线程被唤醒\n"); flag = 0; pthread_mutex_unlock(&mutex); } return NULL; } // 唤醒接口:修改变量并唤醒 void trigger(void) { pthread_mutex_lock(&mutex); flag = 1; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); } // 测试主线程 int main(void) { pthread_t tid; pthread_create(&tid, NULL, wait_task, NULL); while (1) { sleep(2); trigger(); } return 0; }

四、Linux 编译与运行

1)编译(必须加-pthread

gcc cond.c -o cond -pthread

2)运行

./cond

3)运行效果

线程被唤醒 线程被唤醒 线程被唤醒 ...

4)查看 CPU(关键验证)

新开终端执行:

top -p $(pidof cond)

等待线程 CPU 占用:0%


五、极简使用模板(工程直接复制)

// 全局定义 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; int ready = 0; // 等待 void wait_ready(void) { pthread_mutex_lock(&mutex); while (ready == 0) pthread_cond_wait(&cond, &mutex); ready = 0; pthread_mutex_unlock(&mutex); } // 唤醒 void set_ready(void) { pthread_mutex_lock(&mutex); ready = 1; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); }

六、关键规则(必记)

  1. 必须配合互斥锁使用

  2. 必须用 while 判断条件,防止伪唤醒

  3. pthread_cond_wait内部会自动解锁/重新加锁

  4. 休眠时不占 CPU,唤醒时实时响应


七、适用场景

  • 等待数据就绪

  • 等待状态变更

  • 等待事件触发

  • 低功耗、高实时性线程设计

http://www.jsqmd.com/news/576644/

相关文章:

  • IDM注册表权限控制技术深度解析:突破30天试用期的终极方案
  • mT5分类增强版中文-base效果惊艳:同一输入生成‘正式/口语/幽默’三风格文本示例
  • 【Geek卸载工具】Geek Uninstaller官网下载 | Geek Uninstaller专业软件卸载清理工具 - xiema
  • ngx_hash_key_lc
  • GBase 8c 表结构变更前的对象依赖排查
  • HomeAssistant——二元传感器值模板
  • 从末九到华五:一位网安学子的保研实战复盘与避坑指南
  • GBase 8c 同一事务两次查询结果不一致的排查
  • 电子文档怎么转PDF?电子文档转PDF超简单!5个方法零门槛,小白也能秒会
  • 智能关注管理:B站账号自动化清理方案
  • 西门子828D/840Dsl数控系统数据采集实战:端口配置与防火墙优化指南
  • OpCore-Simplify:5步完成黑苹果自动化配置,零代码EFI生成终极指南
  • 2026年4月全球显微镜品牌厂家推荐:TOP5口碑产品评测对比知名 - 品牌推荐
  • HS2-HF_Patch深度解析:游戏模组生态系统的技术架构与实现原理
  • 如何快速掌握Subtitle Edit:新手也能上手的完整实战指南
  • 高收益诱饵下的金融欺诈与钓鱼攻击机理及防御研究
  • 自动化智能体生成+外接MCP,我用 ModelEngine Nexent 5分钟手搓了一个小红书爆款收割机
  • 阿里万物识别模型5分钟上手:零基础小白也能看懂图片的保姆级教程
  • 如何将Figma设计文件一键转换为JSON格式?终极指南揭秘
  • 嵌入式干湿球湿度计算库:纯C轻量级RH算法实现
  • OpenClaw+千问3.5-9B模型微调:适配专业领域任务
  • 如何用Melanopic EDI软件优化室内照明设计?CIE标准实战指南
  • Comfy UI Docker 镜像构建实战:从零到部署的完整指南
  • tao-8k嵌入模型实测:Xinference免配置部署,长文本处理效率翻倍
  • 如何通过WebPlotDigitizer实现数据解放:面向科研工作者的图表数据提取解决方案
  • [特殊字符]2026 最新横评|毕业论文排版避坑指南:四大权威工具实测,告别反复修改一次过
  • 2026 年互联网 1300道Java 面试题最新整理附答案汇总(建议收藏)
  • 亚马逊变体商品 API 的数据处理技巧
  • 显微镜品牌厂家哪家好?2026年4月推荐评测口碑对比顶尖五家 - 品牌推荐
  • 避坑指南:在树莓派Zero 2 W上跑Vosk中文唤醒词,如何优化内存和延迟?