首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Monitor.TryEnter()

Monitor.TryEnter()
EN

Stack Overflow用户
提问于 2012-02-14 22:10:13
回答 3查看 1.7K关注 0票数 5

我在想监视器类。据我所知,并不是所有的等待线程都是FIFO。第一个获得锁的人并不总是等待队列中的第一个。这是正确的吗?有什么方法可以确保FIFO条件吗?

问候

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-14 22:15:47

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

尤其是这句话:

因为监视器在内部使用内核对象,所以它们表现出与操作系统同步机制相同的大致相同的行为(在上一章中描述)。监视器是不公平的,因此如果在唤醒的等待线程尝试获取锁之前,另一个线程尝试获取锁,则允许偷偷摸摸的线程获取锁。

票数 2
EN

Stack Overflow用户

发布于 2012-02-14 22:16:25

如果你指的是一种内置的方式,那就不是。根据定义,在循环中反复调用TryEnter是不公平的,不幸的是,简单的Monitor.Enter也是如此。从技术上讲,一个线程可能会永远等待,而不会获得锁。

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

票数 3
EN

Stack Overflow用户

发布于 2012-02-15 00:45:06

有没有什么方法可以保证

的条件?

一言以蔽之:不!

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9278335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档