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. 最后解锁
相关推荐
默 语2 小时前
Records、Sealed Classes这些新特性:Java真的变简单了吗?
java·开发语言·python
止观止2 小时前
拥抱 ESNext:从 TC39 提案到生产环境中的现代 JS
开发语言·javascript·ecmascript·esnext
卷心菜狗2 小时前
Python进阶-深浅拷贝辨析
开发语言·python
时寒的笔记2 小时前
js逆向7_案例惠nong网
android·开发语言·javascript
Evand J2 小时前
【MATLAB例程】基于低精度IMU、GNSS的UAV初始航向(三维角度)校准的仿真,包含卡尔曼滤波、惯导解算与校正
开发语言·matlab·gnss·imu·卡尔曼滤波
feng_you_ying_li2 小时前
c++之哈希表的介绍与实现
开发语言·c++·散列表
网域小星球3 小时前
C 语言从 0 入门(十四)|文件操作:读写文本、保存数据持久化
c语言·开发语言·文件操作·fopen·fprintf
网域小星球3 小时前
C 语言从 0 入门(七)|字符数组与字符串完整精讲|VS2022 高质量实战
c语言·开发语言·字符串·vs2022·字符数组
Jia ming3 小时前
C语言实现日期天数计算
c语言·开发语言·算法