Monitor.TryEnter()

时间:2012-02-14 14:10:13

标签: c# .net multithreading .net-4.0

我想知道Monitor Class。 据我所知,所有等待的线程都不是FIFO。 获取锁的第一个并不是等待队列中的第一个。 它是否正确? 有没有办法确保FIFO条件?

此致

3 个答案:

答案 0 :(得分:3)

如果你指的是内置方式,那么没有。在循环中反复调用TryEnter根据定义是不公平的,不幸的是,这两者都不是简单的Monitor.Enter。从技术上讲,线程可以永远等待而不会获得锁定。

如果你想要绝对公平,你需要自己使用队列来实现它,以跟踪到达顺序。

答案 1 :(得分:3)

  

有没有办法确保FIFO条件?

总之:不!

我写了一篇关于此的简短文章:Is the Ready Queue FIFO?

答案 2 :(得分:2)

看看这个问题,我认为这对你非常有用 - Does lock() guarantee acquired in order requested?

尤其是这句话:

  

因为监视器在内部使用内核对象,所以它们表现相同   操作系统同步机制也具有粗略的FIFO行为   展览(在前一章中描述)。监视器是不公平的,所以   如果另一个线程试图在唤醒等待之前获取锁定   线程尝试获取锁,允许偷偷摸摸的线程   获得一把锁。