-
21-08-2019 - |
题
我正在扩展信号量的功能。当我意识到我不知道实际信号量的实现时,我遇到了障碍,为了确保我的代码正确运行,我需要知道这一点。
我知道信号量的工作原理是在调用 sem_wait() 时阻塞正在等待它的线程,而另一个线程当前已锁定它。然后该线程被阻塞,然后放入该信号量的等待列表中。
我的问题与 sem_post() 上发生的情况有关。下一个线程是否从等待列表中拉出,设置为锁定线程,并允许解除阻塞?或者发帖方案完全不同?
谢谢!
解决方案
信号量 有两个操作:
P()
获取信号量(你似乎称之为sem_wait
)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想要找到它的将是能够与尽快完成的过程,所以它可以回到其喝着茶和运行恶意软件。