面试题答案
一键面试使用场景差异
- 互斥锁(Mutex):
- 主要用于保护共享资源,确保同一时间只有一个线程能够访问该资源。适用于对临界区的简单保护场景,比如一个共享的全局变量,或者一段共享的代码区域,在某一时刻只能有一个线程执行这段代码来避免数据竞争。例如在多线程的银行转账程序中,对账户余额这个共享资源的访问就可以用互斥锁保护。
- 信号量(Semaphore):
- 用于控制同时访问某个资源的线程数量。适合资源数量有限的场景,比如连接池中有固定数量的数据库连接,信号量可以控制同时获取连接的线程数量,防止过多线程同时请求连接导致资源耗尽。
- 条件变量(Condition Variable):
- 通常用于线程间的同步通信,当某个条件满足时通知等待的线程。比如生产者 - 消费者模型中,当缓冲区有数据时,生产者线程通过条件变量通知消费者线程进行消费;当缓冲区有空闲位置时,消费者线程通过条件变量通知生产者线程进行生产。
功能特性差异
- 互斥锁(Mutex):
- 只有两种状态,锁定和解锁。线程获取锁成功后进入临界区,操作完成后释放锁。它的功能相对简单,主要是实现对共享资源的独占访问。
- 信号量(Semaphore):
- 有一个计数器,记录可用资源的数量。线程获取信号量时,计数器减1;释放信号量时,计数器加1。当计数器为0时,其他线程获取信号量会阻塞。信号量可以允许多个线程同时访问共享资源,只要线程数量不超过计数器的初始值。
- 条件变量(Condition Variable):
- 本身不具备锁的功能,通常要和互斥锁配合使用。它提供了等待(wait)和通知(notify)机制,线程可以在条件变量上等待某个条件满足,当其他线程通过通知操作改变条件后,等待的线程被唤醒继续执行。