面试题答案
一键面试在Linux环境下,使用POSIX信号量来实现互斥访问临界区,关键代码如下:
#include <semaphore.h>
// 定义一个信号量
sem_t mutex;
// 初始化信号量
sem_init(&mutex, 0, 1);
在初始化信号量 sem_init(&mutex, 0, 1)
时,第三个参数设置为1,这是因为:
- 信号量本质:信号量是一个计数器,其值表示可用的资源数量。
- 互斥原理:当设置初始值为1时,意味着只有1个“单位”的资源可用。当一个线程想要进入临界区,它需要获取这个信号量(此时信号量的值减1变为0)。由于信号量值变为0,其他线程再尝试获取信号量时就会被阻塞,直到占用信号量的线程释放信号量(信号量的值加1变为1)。这样就保证了同一时间只有一个线程能够进入临界区,从而实现了互斥访问。
在使用完信号量后,应该通过 sem_destroy(&mutex)
来销毁信号量,以释放相关资源。