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. 最后解锁
相关推荐
AI科技星5 分钟前
全域数学·第卷:场计算机卷(场空间计算机)【乖乖数学】
java·开发语言·人工智能·算法·机器学习·数学建模·数据挖掘
charlie11451419112 分钟前
嵌入式C++实践开发第21篇(单片机实践):按钮输入 —— 硬件原理、消抖与HAL API
开发语言·c++·单片机
前端老石人13 分钟前
前端开发中的 URL 完全指南
开发语言·前端·javascript·css·html
0xDevNull15 分钟前
Java泛型详解
java·开发语言·后端
yeeanna16 分钟前
GO函数的特殊性
开发语言·后端·golang
AI科技星20 分钟前
《全域数学》第三卷:代数原本 · 全书详述【乖乖数学】
开发语言·人工智能·机器学习·数学建模
时空系20 分钟前
第10篇:归属权与借用——Rust的安全保障 Rust中文编程
开发语言·安全·rust
Sarvartha24 分钟前
三目运算符
linux·服务器·前端
AI进化营-智能译站25 分钟前
ROS2 C++开发系列13-运算符重载让ROS2消息处理更自然
java·开发语言·c++·ai
时空系26 分钟前
第6篇:数据容器——管理大量数据 Rust中文编程
开发语言·后端·rust