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. 最后解锁
相关推荐
2601_9679873735 分钟前
安装 Redis 或 Redis Stack
linux·windows·redis·macos·安装
feng_you_ying_li36 分钟前
linux之数据链路层
linux·网络·智能路由器
Evand J1 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
GeW2 小时前
高端化走到深处,是数据库和Linux的事
linux
BaiPeter2 小时前
ZPL文件预览
开发语言·c++
程序员初一3 小时前
Linux 远程桌面有四种做法
linux·ssh
程序开发阿元4 小时前
1C1G 能跑什么:把留常驻服务和不留摆进一张内存表
linux·ssh
xbzb6 小时前
自定义 yum 软件源:Linux 上 createrepo,Windows 上纯 Python 也能造
linux·运维·windows·python·yum·createrepo
Android系统攻城狮6 小时前
Linux FFmpeg深度解析之avio_open调用流程与实战(三十八)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
独隅6 小时前
WebStorm Linux 版安装实战与核心效能展示
linux·ide·webstorm