面试题答案
一键面试条件变量基本原理
- 概念:条件变量是一种线程同步机制,用于线程间的条件等待和通知。它允许线程在满足特定条件时才继续执行。
- 工作流程:
- 等待条件:一个或多个线程调用
pthread_cond_wait
函数,进入等待状态。此时线程会释放其持有的互斥锁(这是pthread_cond_wait
函数内部自动完成的),并将自己挂起在条件变量的等待队列上。 - 条件改变与通知:当某个线程使得条件满足时,它调用
pthread_cond_signal
或pthread_cond_broadcast
函数。pthread_cond_signal
会唤醒等待队列中的一个线程,而pthread_cond_broadcast
会唤醒等待队列中的所有线程。 - 重新竞争互斥锁与继续执行:被唤醒的线程会重新竞争获取互斥锁(在
pthread_cond_wait
函数返回前)。一旦获取到互斥锁,线程就可以安全地检查条件是否满足,并继续执行相关操作。
- 等待条件:一个或多个线程调用
互斥锁的作用
- 保护共享资源:在多线程环境中,共享资源可能会被多个线程同时访问,导致数据不一致等问题。互斥锁可以确保在同一时间只有一个线程能够访问共享资源。
- 与条件变量配合:
- 确保条件检查的原子性:在检查条件是否满足时,需要使用互斥锁来保证这个检查过程不会被其他线程干扰。例如,在检查某个标志位(作为条件)时,如果没有互斥锁保护,一个线程可能在检查标志位为假后,还没来得及进入等待状态,另一个线程就修改了标志位,导致该线程错过通知。
- 保护条件变量操作:对条件变量的等待(
pthread_cond_wait
)和通知(pthread_cond_signal
/pthread_cond_broadcast
)操作也需要在持有互斥锁的情况下进行,以保证条件变量状态的一致性和操作的原子性。