我想知道Monitor Class。 据我所知,所有等待的线程都不是FIFO。 获取锁的第一个并不是等待队列中的第一个。 它是否正确? 有没有办法确保FIFO条件?
此致
答案 0 :(得分:3)
如果你指的是内置方式,那么没有。在循环中反复调用TryEnter
根据定义是不公平的,不幸的是,这两者都不是简单的Monitor.Enter
。从技术上讲,线程可以永远等待而不会获得锁定。
如果你想要绝对公平,你需要自己使用队列来实现它,以跟踪到达顺序。
答案 1 :(得分:3)
答案 2 :(得分:2)
看看这个问题,我认为这对你非常有用 - Does lock() guarantee acquired in order requested?
尤其是这句话:
因为监视器在内部使用内核对象,所以它们表现相同 操作系统同步机制也具有粗略的FIFO行为 展览(在前一章中描述)。监视器是不公平的,所以 如果另一个线程试图在唤醒等待之前获取锁定 线程尝试获取锁,允许偷偷摸摸的线程 获得一把锁。