假设我们有一个信号量s并且有多个线程通过调用P(s)来等待它。然后V(s)将唤醒其中的一个线程。有没有办法唤醒指定的线程,而不是让系统做出决定?例如,在理发店的问题上,每次理发后,理发师都希望为最长的等待顾客服务,而不是随意的。
答案 0 :(得分:1)
您可以使用队列存储P。这将让你在最长的等待基础上做到这一点。如果不是,您可以根据您想要的任何参数存储在已排序的树中,并在需要时删除。
我认为它的关键是P的某种排序机制,它不会太复杂。
答案 1 :(得分:1)
这取决于信号量的实现。您必须使用智能信号量来创建等待线程的队列并以正确的顺序发出信号。我认为Windows上的常规信号量实现不会那样。它只是向OS发送一个信号,然后OS向任何等待的线程发送信号。如果它使用了一个lifo堆栈甚至是有意义的,因为它更容易实现。 但是通过实现一个队列(可能是链表或循环数组)来自己构建它并不困难。
答案 2 :(得分:1)
不,不是自己的经典信号量。如果您想要类似队列的行为,则需要创建一个队列(带有信号量,或者可能是其中的几个)来保护队列的共享数据结构。
现实情况是,虽然理论上信号量只需要进行同步,但你很少(从不?)编写一大堆直接使用裸信号量的实际代码。大多数情况下,您使用(例如)信号量构建更高级别的构造来保护该构造中的关键数据。