我正在扩展信号量的功能。当我意识到我不知道实际信号量的实现时,我遇到了障碍,为了确保我的代码正确运行,我需要知道这一点。

我知道信号量的工作原理是在调用 sem_wait() 时阻塞正在等待它的线程,而另一个线程当前已锁定它。然后该线程被阻塞,然后放入该信号量的等待列表中。

我的问题与 sem_post() 上发生的情况有关。下一个线程是否从等待列表中拉出,设置为锁定线程,并允许解除阻塞?或者发帖方案完全不同?

谢谢!

有帮助吗?

解决方案

信号量 有两个操作:

  1. P() 获取信号量(你似乎称之为 sem_wait)
  2. V() 释放信号量(你似乎称之为 sem_post)

信号量还有一个与其关联的整数,它是允许在不阻塞的情况下传递 P() 的并发线程数。对 P() 的其他调用将阻塞,直到调用 V() 来释放位置。

这是信号量的经典定义。

编辑: 信号量不保证任何顺序。他们不必实际使用队列或其他 FIFO 结构。当一次只允许一个线程时,当它调用 V() 时,另一个(可能是随机的)线程将从其 P() 调用中返回并继续。

其他提示

在下一线程解除阻塞上它的sem_wait()将任何线程中的OS决定是下一个上下文切换到。没有人能强迫订购任何保证;这取决于你的操作系统的调度策略。这可能是该线程已经关闭CPU时间最长,或已分配的最高“优先级”的一个,或者一个在历史上有一定的资源使用统计信息,或什么的。

最有可能的,你当前线程将继续运行一段时间,直到它开始于另一个信号等待用户输入,块,或耗尽其操作系统分配时间片(也称为sem_post()的一个)。然后,操作系统将在一些完全无关的进程切换为第二(可能是Firefox或东西)的一小部分运行,然后熄灭,并处理一些网络流量,获得自身一杯茶,最后,当它得到各地它,捡起它感觉就像你的其他线程的基础上,东西取像是否感觉基于过去的历史,特定的线程是更多的CPU和I / O限制。

在许多操作系统,优先级被给予I / O绑定进程尚未存在了很长时间。该理论认为,新工艺可能是短暂的(如果它存在了已经五个小时,赔率是它不会在接下来的1毫秒来完成了),所以我们还不如让他们在用。 I / O密集型进程很可能继续成为I / O限制,这意味着很有可能他们会关掉不久,在等待其他资源的CPU。基本上,OS想要找到它的将是能够与尽快完成的过程,所以它可以回到其喝着茶和运行恶意软件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top