为什么在使用监视器时每个对象都有一个就绪的等待队列?如果线程使用对象完成,只需弹出等待队列中的下一项即可。就绪队列似乎是多余的。
上下文是.NET,更具体地说是监视器类。
发布于 2013-06-07 05:03:34
生产者/消费者队列是学习Monitor类的一个很好的用例。
假设工作是偶尔添加到队列中的。有时需要处理的项目很多,有时队列中没有项目,需要处理很长的时间。
因此,假设您有k个使用者线程等待处理队列中的项。换句话说,每个线程都实现了一个紧密的循环,不断地尝试
lock (这将您置于监视器的“就绪”队列中)。如果您选择"a“选项,您的k线程将浪费CPU周期一遍又一遍地在就绪队列中移动,找不到要做的工作,并在队列后面重新开始。
如果你选择"b“选项,你是在说”现在这里没有什么可做的,让我睡一觉,在有事情做的时候叫醒我“。
使用选项"b",如果队列为空,您很快就会发现所有的消费者都睡在“等待”队列中,并且没有浪费CPU时间。
然后,当生产者向队列中添加一个项目时,它调用Monitor.Pulse。这会唤醒“等待”队列中的第一个线程,然后该线程将进入“就绪”队列的后面(如果“就绪”队列为空,队列也是队列的前端)。
当线程从队列中获取锁并使用该项时,它再次调用Monitor.Enter,并转到“就绪”队列的后面。
有关生产者/消费者队列在这篇文章中的经典实现,请参阅.NET。
发布于 2013-06-06 22:20:54
假设我对你的问题有了正确的理解,那两个问题的目的就不同了。
“就绪”队列用于准备在获得锁后立即运行的线程。他们只是在等着拿到锁。这主要用于互斥,以防止两个线程同时使用相同的资源。
“等待”队列用于等待特定信号的线程--即被脉冲的监视器。这通常用于协调--例如,在生产者/消费者队列中,如果队列为空,消费者将等到监视器被脉冲后再检查队列。虽然没有人在生产,也没有人在消费,但是没有线程拥有监视器--没有资源在使用。但显示器是用来协调消费者与生产者的关系。
https://stackoverflow.com/questions/16973172
复制相似问题