问题标签 [spurious-wakeup]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - spurios 唤醒是否伴随着 InterruptedException?
Object.wait
用于提及的 javadoc ,
与单参数版本一样,中断和虚假唤醒是可能的,并且此方法应始终在循环中使用。
它没有提到InterruptedException
这里需要处理 a 。这是否意味着等待方法可能会自发唤醒而不会抛出一个。
我环顾四周,但没有找到任何关于唤醒实际处理方式的具体信息。
由于虚假中断不是一件事(或者我已经读过),我相信情况就是如此。我只是在寻找对此的确认。
c++ - 虚假唤醒是否会解除所有等待线程的阻塞,甚至是不相关的线程?
我对 C++ 中的多线程仍然很陌生,我目前正试图围绕“虚假唤醒”以及导致它们的原因。我已经对条件变量、内核信号、futex 等进行了一些挖掘,并发现了一些关于“虚假唤醒”为何以及如何发生的罪魁祸首,但仍有一些我无法找到答案。 .
问题:虚假唤醒是否会解除所有等待/阻塞线程的阻塞,甚至是等待完全不相关通知的线程?或者阻塞线程是否有单独的等待队列,因此等待另一个通知的线程受到保护?
示例:假设我们有 249 名斯巴达人等待攻击波斯人。他们wait()
为他们的领袖列奥尼达斯(第 250 人)要notify_all()
何时进攻。现在,在营地的另一边,有 49 名受伤的斯巴达人正在等待医生(第 50 名)来notify_one()
治疗每个人。虚假的唤醒会解除所有等待的斯巴达人,包括受伤的斯巴达人,还是只会影响等待战斗的人?等待线程有两个单独的队列,还是只有一个?
如果该示例具有误导性,我深表歉意……我不知道如何解释它。
multithreading - POSIX 条件变量 VS Win32 Event Objects(关于虚假唤醒问题)
在 POSIX 中,由于“虚假唤醒”问题,程序员在检查条件时被迫使用while()
而不是。if
我认为虚假唤醒是不直观且令人困惑的问题,但我认为这是一个不可避免的问题。
最近发现win32的事件对象不存在“虚假唤醒”的问题。
为什么 POSIX 系统和其他系统仍然使用具有“虚假唤醒”问题的条件变量?(尽管这可以解决?)
c++ - 如何避免没有谓词的虚假唤醒?
我有一个线程让我们称之为 t1,它会在 x 秒后定期发送一些东西。这个“x 秒部分”可以从其他线程 (t2)更改。我应该能够从线程 t1 执行以下操作。
- 等待“x 秒”然后发送一些东西
- 如果线程 t2 发送另一个 "x" 值,则不要发送,而是转到第 1 步。
我为此目的使用了条件变量 wait_for()
我只想在“x 秒”结束时发送。
目前我已经在没有谓词的情况下实现了它(因为我不需要它)是这样的:
但有时我会在 timeout 之前看到“发送发生”,我认为这是由于虚假唤醒和缺少谓词造成的。
我的问题是如何在没有谓词的情况下处理虚假唤醒?我应该为此采取另一种方法吗?我不需要谓词,因为线程 t1 在特定条件下休眠(当 x 为 0 时)并且我希望它(t1)在没有任何条件的情况下被 t2 唤醒。
这是我第一个使用 cond 变量的任务,我还在学习 CPP,提前谢谢你。
java - 有什么好方法可以区分虚假唤醒和 Thread.interrupt() 吗?
我想创建一个可以随时中断的线程,同时防止虚假唤醒。这里的问题是虚假唤醒和中断的工作方式相同:它们抛出InterruptedException
从中我看到,没有办法仅仅用jdk来区分它们,甚至Condition
没有用。我看到的唯一可能的解决方案是为volatile boolean
每个线程使用一些额外的东西,但这Thread.interrupt()
本身就变得毫无用处。