Linux记录过程

线程同步

Linux 线程:互斥锁 + 条件变量 必须搭配使用的核心原因

条件变量本身不具备 "保护共享资源" 的能力,它只负责 "等待 + 唤醒";互斥锁负责 "保护共享资源",两者缺一不可。

1. 先明确两个东西的本职工作

互斥锁(mutex)

作用:保护共享数据,防止多个线程同时修改 / 读取,避免数据混乱。

  • 上锁:我在用,别人不许碰
  • 解锁:我用完了,别人可以用
  • 只解决 "并发访问冲突",不解决 "等待条件满足"

条件变量(cond)

作用:让线程 "休眠等待",直到某个条件满足后被唤醒。

  • 等待:条件不满足,我先睡
  • 唤醒:条件满足了,喊醒等待的线程
  • 只解决 "等待 / 通知",完全不保护共享数据
bash 复制代码
// 固定用法!
pthread_cond_wait(&cond, &mutex);

这个函数内部做了三件不可分割的事:

  1. 解锁互斥锁(让其他线程能修改共享条件)
  2. 让当前线程休眠等待
  3. 被唤醒后,自动重新加锁(保证醒来后安全访问共享资源)

✅ 为什么要解锁? 如果不解锁,线程抱着锁睡觉,其他线程根本无法修改条件(比如往队列放数据),程序直接死锁!

  1. 标准固定用法(背下来,永远不会错)
cpp 复制代码
// 线程里的固定模板
pthread_mutex_lock(&mutex);       // 1. 先上锁

// 2. 循环判断条件(必须用while,不能用if)
while (条件不满足) {
    pthread_cond_wait(&cond, &mutex); // 3. 等待(内部解锁+休眠+唤醒后重新上锁)
}

// 4. 条件满足,操作共享资源
do_something();

pthread_mutex_unlock(&mutex);     // 5. 最后解锁
相关推荐
AlfredZhao21 分钟前
用脚本按顺序执行初始化 DB 的 SQL 文件
linux
瑞克-桑切斯1 小时前
企业生产环境:https部署+nginx高可用(业务不中断)
linux·服务器·数据库
http阿拉丁神猫4 小时前
Go语言入门笔记:从基础到开发环境搭建(二)
开发语言·笔记·golang
不会就选b4 小时前
C++补充部分(一)--lambda 表达式
开发语言·c++
Pniubi7 小时前
HashMap的扩容和树化边界
java·开发语言
浩浩测试一下8 小时前
Linux 底层知识点 1
linux·运维·服务器
gCode Teacher 格码致知9 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
Escalating_xu9 小时前
【Linux 网络编程】TCP 跨平台实战:用 Windows 客户端访问 Linux 服务器
linux·服务器·网络
发量惊人的中年网工9 小时前
分公司访问总部ERP慢怎么办?SD-WAN组网的排查与验收要点
服务器·开发语言·php
下页、再停留9 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#