sem_post 是不是唤醒了一个随机进程

Posted

技术标签:

【中文标题】sem_post 是不是唤醒了一个随机进程【英文标题】:Does sem_post wake up a random processsem_post 是否唤醒了一个随机进程 【发布时间】:2020-12-13 09:22:39 【问题描述】:

假设有 10 个进程正在使用 sem_wait() 等待一个信号量。 第 11 个进程在该信号量上调用 sem_post。 10 个进程中的哪一个会进入临界区? 是不是很随机?所有进程都会被唤醒,并努力实现锁。 CPU 将为其中一个进程提供锁,其余进程将返回等待状态

【问题讨论】:

不是 CPU,而是操作系统(更准确地说,是操作系统内核中的调度程序代码)。并且您的问题的答案取决于操作系统配置为工作的调度模式。例如,在所有线程具有相同优先级的情况下,轮询将选择最长时间脱离上下文的线程时间。 '所有进程都会被唤醒,争取实现一个锁'没有。没有必要出现这种严重的低效率。等待线程存储在信号量、树、队列等的容器中)。如果信号到达,则从容器中弹出一个线程并准备好/运行。 【参考方案1】:

POSIX 标准没有指定将唤醒哪个线程。此外,如果没有人为的延迟,线程就不可能以明确定义的顺序开始等待信号量。

实际上,它可能是等待时间最长的线程,因为队列结构用于记录等待同步对象的线程。它绝对不会是一个“随机”线程。但这也不是您应该依赖代码的正确性的东西。

【讨论】:

以上是关于sem_post 是不是唤醒了一个随机进程的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu:sem_timedwait 没有醒来(C)

在没有内核支持的情况下唤醒线程

C++11多线程编程-两个进程轮流打印1~100

MPI中每个进程的随机数

随机love'...

Anylogic 7:不同进程的不同随机发生器