operating-system - 当信号量上的进程调用信号时会发生什么?
问题描述
如果信号量上的进程调用信号会发生什么。
假设信号量计数为 3。进程 P1、P2、P3 调用等待信号量并进入临界区。P4、P5、P6 也称为等待,但由于信号量计数已经为 0,它们将在信号量的等待队列中等待。现在 P7 来了并调用了 signal(),等待信号量的进程(P4、P5 或 P6)会被唤醒吗?它被唤醒,然后它是一个错误,因为信号量计数为 2,但 p1、p2 和 p3 还没有离开临界区。
解决方案
只有一个正在休眠的线程(P4、P5 和 P6 之一)将被唤醒。你说信号量是 2,但实际上是 1,对吧?
这种行为是正确的,因为 P7 调用了signal
. 任何线程都可以调用signal
信号量,即使它最初没有调用wait
信号量。这与互斥锁不同,互斥锁确实有所有权的概念(例如,如果线程从不调用unlock
互斥锁,则它不能调用lock
互斥锁)。
推荐阅读
- python - python变量类型声明找不到自己的类类型
- asp.net - 在脱机模式下运行 Blazor Web Assembly
- objective-c - 目标 C:sceneDidEnterBackground 中的函数未运行
- json - 如何创建函数以在 Flutter 中传递 Json 数据?
- .net-core - 我们收到一些异常,异常消息:“LINQ 表达式 'DbSet
() - python - 预提交 MyPy 钩子:如何为变量强制执行显式类型?
- python - 如何在 MNE-Python 中读取“.edf”文件。我试过但显示以下错误
- java - 没有正则表达式的 URL 路径匹配器
- git - 如何在 GitLab 中正确使用 git send-email?
- reactjs - 如何从 redux 导入和加载图像?