MST
星途 面试题库

面试题:操作系统中并发与同步之信号量应用

在一个多线程程序中,有多个线程需要访问共享资源。请描述如何使用信号量来实现对共享资源的并发控制,确保同一时间只有特定数量的线程可以访问该共享资源。并简要说明信号量的原理和相关操作。
35.2万 热度难度
操作系统并发与同步

知识考点

AI 面试

面试题答案

一键面试

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) 函数。