面试题答案
一键面试1. 使用信号量实现共享资源并发控制的方法
假设允许同时访问共享资源的线程数量为 n
。在多线程程序中,初始化一个信号量,将其初始值设置为 n
。每个线程在访问共享资源前,先获取信号量(如果信号量的值大于0,则将其值减1,线程可以继续执行;如果信号量的值为0,则线程被阻塞,直到信号量的值变为大于0)。当线程访问完共享资源后,释放信号量(将信号量的值加1),这样其他被阻塞的线程就有可能获取到信号量从而访问共享资源。
2. 信号量的原理
信号量是一个整型变量,它通过一个计数器来控制对共享资源的访问。计数器的值表示当前可用的资源数量。当一个线程获取信号量时,计数器的值减1;当一个线程释放信号量时,计数器的值加1。如果计数器的值为0,意味着当前没有可用资源,试图获取信号量的线程将被阻塞,直到其他线程释放信号量使计数器的值变为大于0。
3. 相关操作
- 初始化:设置信号量的初始值,即允许同时访问共享资源的线程数量。例如在C语言中使用POSIX信号量,
sem_init(sem_t *sem, int pshared, unsigned int value)
函数用于初始化信号量,value
就是初始值。 - 获取信号量:也称为
P
操作或wait
操作。线程调用此操作尝试获取信号量,如果信号量的值大于0,将其值减1,线程继续执行;否则线程被阻塞。如POSIX信号量中使用sem_wait(sem_t *sem)
函数。 - 释放信号量:也称为
V
操作或post
操作。线程在访问完共享资源后调用此操作,将信号量的值加1,如果有其他线程因获取信号量而被阻塞,会唤醒其中一个线程。在POSIX信号量中使用sem_post(sem_t *sem)
函数。