我在想监视器类。据我所知,并不是所有的等待线程都是FIFO。第一个获得锁的人并不总是等待队列中的第一个。这是正确的吗?有什么方法可以确保FIFO条件吗?
问候
发布于 2012-02-14 22:15:47
看看这个问题,我认为它对你很有用-- Does lock() guarantee acquired in order requested?
尤其是这句话:
因为监视器在内部使用内核对象,所以它们表现出与操作系统同步机制相同的大致相同的行为(在上一章中描述)。监视器是不公平的,因此如果在唤醒的等待线程尝试获取锁之前,另一个线程尝试获取锁,则允许偷偷摸摸的线程获取锁。
发布于 2012-02-14 22:16:25
如果你指的是一种内置的方式,那就不是。根据定义,在循环中反复调用TryEnter是不公平的,不幸的是,简单的Monitor.Enter也是如此。从技术上讲,一个线程可能会永远等待,而不会获得锁。
如果您想要绝对公平,您将需要自己实现它,使用队列来跟踪到达顺序。
发布于 2012-02-15 00:45:06
有没有什么方法可以保证
的条件?
一言以蔽之:不!
为此,我写了一篇简短的文章:Is the Ready Queue FIFO?
https://stackoverflow.com/questions/9278335
复制相似问题