首页 > 解决方案 > 当信号量上的进程调用信号时会发生什么?

问题描述

如果信号量上的进程调用信号会发生什么。

假设信号量计数为 3。进程 P1、P2、P3 调用等待信号量并进入临界区。P4、P5、P6 也称为等待,但由于信号量计数已经为 0,它们将在信号量的等待队列中等待。现在 P7 来了并调用了 signal(),等待信号量的进程(P4、P5 或 P6)会被唤醒吗?它被唤醒,然后它是一个错误,因为信号量计数为 2,但 p1、p2 和 p3 还没有离开临界区。

标签: operating-systemmutexsemaphorecritical-section

解决方案


只有一个正在休眠的线程(P4、P5 和 P6 之一)将被唤醒。你说信号量是 2,但实际上是 1,对吧?

这种行为是正确的,因为 P7 调用了signal. 任何线程都可以调用signal信号量,即使它最初没有调用wait信号量。这与互斥锁不同,互斥锁确实有所有权的概念(例如,如果线程从不调用unlock互斥锁,则它不能调用lock互斥锁)。


推荐阅读