线程同步
Linux 线程:互斥锁 + 条件变量 必须搭配使用的核心原因
条件变量本身不具备 "保护共享资源" 的能力,它只负责 "等待 + 唤醒";互斥锁负责 "保护共享资源",两者缺一不可。
1. 先明确两个东西的本职工作
互斥锁(mutex)
作用:保护共享数据,防止多个线程同时修改 / 读取,避免数据混乱。
- 上锁:我在用,别人不许碰
- 解锁:我用完了,别人可以用
- 只解决 "并发访问冲突",不解决 "等待条件满足"
条件变量(cond)
作用:让线程 "休眠等待",直到某个条件满足后被唤醒。
- 等待:条件不满足,我先睡
- 唤醒:条件满足了,喊醒等待的线程
- 只解决 "等待 / 通知",完全不保护共享数据
bash
// 固定用法!
pthread_cond_wait(&cond, &mutex);
这个函数内部做了三件不可分割的事:
- 解锁互斥锁(让其他线程能修改共享条件)
- 让当前线程休眠等待
- 被唤醒后,自动重新加锁(保证醒来后安全访问共享资源)
✅ 为什么要解锁? 如果不解锁,线程抱着锁睡觉,其他线程根本无法修改条件(比如往队列放数据),程序直接死锁!
- 标准固定用法(背下来,永远不会错)
cpp
// 线程里的固定模板
pthread_mutex_lock(&mutex); // 1. 先上锁
// 2. 循环判断条件(必须用while,不能用if)
while (条件不满足) {
pthread_cond_wait(&cond, &mutex); // 3. 等待(内部解锁+休眠+唤醒后重新上锁)
}
// 4. 条件满足,操作共享资源
do_something();
pthread_mutex_unlock(&mutex); // 5. 最后解锁