当前位置: 首页 > 面试题库 >

C#Monitor.Wait()是否遭受虚假唤醒?

姜嘉赐
2023-03-14
问题内容

Java的Object.wait()警告“虚假唤醒”,但C#的Monitor.wait()似乎根本没有提及。

了解Mono是如何在Linux之上实现的,并且Linux具有虚假的唤醒功能,难道不应该在某个地方对此进行记录吗?


问题答案:

Joe Duffy的“Windows并行编程”中提到了这一点(P311-312,P598)。这一点很有趣:

请注意,在以上所有示例中,线程必须对所谓的虚假唤醒具有弹性-
使用条件变量的代码即使在过早唤醒(即在查找条件之前)也应保持正确和生动。成立。这不是因为该实现实际上会执行此类操作(尽管已知其他平台(例如Java和Pthreads)上的某些实现也可以这样做),也不是因为在不需要时代码会有意地唤醒线程,而是因为没有这样的事实。确保已唤醒线程的调度时间。条件变量不公平。它’

然后,他给出正常模式,进行一会儿循环测试条件。

我要说的是,可以合理地预期通常Monitor.Wait 不会 过早地唤醒您,并且,如果您绝对 知道 没有其他事情可以改变条件,那么您 可以
在没有条件循环的情况下摆脱困境:但是这样做更安全包括它,以防万一您的逻辑不正确。



 类似资料:
  • 问题内容: 看到各种与锁定相关的问题,并且(几乎)总是发现“由于虚假唤醒而引起的循环” 1我想知道,有人经历过这种唤醒(例如,假设硬件/软件环境不错)吗? 我知道“虚假”一词没有明显的原因,但是发生此类事件的原因可能是什么? (1注意:我不是在问循环练习。) 编辑:一个帮助器问题(对于那些喜欢代码示例的人): 如果我有以下程序,并且运行它: 我该怎么做才能虚假地唤醒它,而不必永远等待随机事件? 问

  • 问题内容: 这是线程正在等待notify()或超时的情况。这里添加了while循环来处理虚假唤醒。 在这种情况下,如何区分虚假唤醒和超时?如果是虚假的唤醒,我需要回去等待。如果超时,我需要退出循环。 我可以轻松识别出notify()的情况,因为我将在notify()调用时将dosleep变量设置为false。 编辑:由于嵌入式项目的要求,我正在使用1.4 Java版本。我无法使用,因为它仅在1.5

  • 问题内容: 根据我所看到的LINQ的许多示例,我正在使用类似于以下代码的代码创建自己的数据上下文和表: 但是对于每个表(小部件,汽车等),我都会得到警告 字段’TableName’从未分配 。我在Google上找不到任何也存在此问题的人。我不觉得我做错了什么,因为我只是复制从不同地方看到的LINQ示例。那么这个警告是怎么回事呢?它警告我一个真正的问题吗?还是我错过了什么? 问题答案: 是的,他们是

  • 假设10个进程使用sem_wait(). 等待一个信号量,第11个进程调用该信号量的sem_post。 10个进程中哪一个将进入临界块? 像随机吗?所有进程将被唤醒并努力实现锁。 ,CPU将为其中一个进程提供锁,其余的进程将返回等待状态

  • 我正在创建一个简单的web代理应用程序使用Java。基本上,main方法创建一个RequestReceiver对象,该对象具有侦听web浏览器http请求的ServerSocket。从ServerSocket.Accept()返回的套接字创建一个新的连接对象,并将其放入线程池中。

  • <代码>文档。all是DOM中的一个非原始对象,它是falsy。 例如,此代码不做任何事情: 有人能解释一下这是为什么吗?