目录
一、同步的概念
此处的同步的概念和我们生活中所理解的同步并不是一回事。我们常说的同步,其意义更贴近于在在同一时间内同时执行多个任务,实际上,这在进程/线程调度的理念中叫做并行。
而进程/线程间同步实际上所指的是协调多个线程或进程的执行顺序,以确保它们以一致和正确的方式访问共享资源。即:在保证数据安全的前提下, 让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,叫做同步。
二、条件变量
在 Linux 中,条件变量(condition variable)是一个用于线程间同步的机制。它允许线程在某些条件满足之前挂起执行,并在条件满足时被唤醒。
条件变量的相关概念
-
条件变量(condition variable): 是一种同步机制,通常与互斥锁(mutex)一起使用。它用于实现线程间的等待和通知机制。
-
等待队列: 当线程在条件变量上调用
pthread_cond_wait
函数时,它会释放相关的互斥锁并进入一个等待队列中。此时线程会被挂起,直到另一个线程通过条件变量的pthread_cond_signal
或pthread_cond_broadcast
函数唤醒它。 -
互斥锁: 条件变量的使用必须与互斥锁配合使用,以确保在检查条件和改变条件时的原子性。
1、条件变量的初始化:静态初始化、动态初始化
2、条件变量的等待:pthread_cond_wait函数
3、条件变量的激发(通知)
3.1、一次唤醒单个线程的函数:pthread_cond_signal
3.2、一次唤醒全部线程的函数:pthread_cond_signal
3.3、需要注意的点!!!
- 虚假唤醒: 即便条件不满足,
pthread_cond_wait
也可能因为虚假唤醒而返回。因此,依赖于条件变量等待的代码经常在while
循环中检查条件,以确保线程确实被因为条件成立而唤醒:
pthread_mutex_t mutex;
pthread_cond_t cond;
int condition;
// ...
void wait_for_condition() {
while (!condition) {
pthread_cond_wait(&cond, &mutex);
}
// condition 现在为真,执行其他工作...
}
3.4、对比总结
要真正的理解同步,我们还需借助代码来理解。下一节我们将介绍使用互斥锁与条件变量实现的生产者消费者模型。