MST

星途 面试题库

面试题:C语言中如何初始化一个信号量用于互斥

在Linux环境下使用C语言,描述如何初始化一个信号量来实现互斥访问临界区,需要写出关键的初始化代码片段,并说明初始化时设置的初始值为什么能实现互斥。
14.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

在Linux环境下,使用POSIX信号量来实现互斥访问临界区,关键代码如下:

#include <semaphore.h>

// 定义一个信号量
sem_t mutex;

// 初始化信号量
sem_init(&mutex, 0, 1);

在初始化信号量 sem_init(&mutex, 0, 1) 时,第三个参数设置为1,这是因为:

  1. 信号量本质:信号量是一个计数器,其值表示可用的资源数量。
  2. 互斥原理:当设置初始值为1时,意味着只有1个“单位”的资源可用。当一个线程想要进入临界区,它需要获取这个信号量(此时信号量的值减1变为0)。由于信号量值变为0,其他线程再尝试获取信号量时就会被阻塞,直到占用信号量的线程释放信号量(信号量的值加1变为1)。这样就保证了同一时间只有一个线程能够进入临界区,从而实现了互斥访问。

在使用完信号量后,应该通过 sem_destroy(&mutex) 来销毁信号量,以释放相关资源。