问题标签 [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 - Do spurious wakeups in Java actually happen?
Seeing various locking related question and (almost) always finding the 'loop because of spurious wakeups' terms1 I wonder, has anyone experienced such kind of a wakeup (assuming a decent hardware/software environment for example)?
I know the term 'spurious' means no apparent reason but what can be the reasons for such kind of an event?
(1 Note: I'm not questioning the looping practice.)
Edit: A helper question (for those who like code samples):
If I have the following program, and I run it:
What can I do to wake this await
up spuriously without waiting forever for a random event?
c++ - condition_variable::wait_for() 如何处理虚假唤醒?
各种平台都允许虚假唤醒。为了解决这个问题,我们写了下面的循环机制:
同样的事情是可以理解的conditional_variable::wait_until()
。
但看看下面的例子:
想象一下,虚假唤醒发生在 1 秒。尚未达到超时。
它会再等10秒吗?这将导致无限循环,我确信这不应该发生。从源代码,内部wait_for()
调用wait_until()
.
我想了解,如何wait_for()
处理虚假唤醒?
c++ - 什么时候可以在没有谓词的情况下使用 std::condition_variable?
如果std::condition_variable
可以由于虚假唤醒而发出信号(并且我们不能确定我们需要的条件是否真的得到满足),为什么 C++ 标准库提供wait()
没有谓词的方法重载?可以使用这种行为的场景是什么?
java - 意外的线程唤醒
我期待以下示例中的第二个线程挂起,因为它等待一个没有相应通知的对象。相反,它通过了 println,大概是由于虚假唤醒。
输出:
另一方面,如果删除“嘿!” println 从第一个线程,第二个线程确实会挂起。这发生在 MacOS 和 Linux 上。
知道为什么吗?
c# - C# 中 WaitOne() 的虚假唤醒
我的程序中有两个 CRITERIA 决定线程应该等待还是继续。
第一个标准: XML 文件中的更改。我有一个文件观察器,如果 XML 文件发生更改,它会设置一个AutoResetEvent
(_waitTillXmlChanges.Set()
),因此线程应该继续。
第二个标准:到期日已到。如果今天是应该进行文件传输的日期,那么第二个标准已经满足,因此线程应该继续。
我当前的代码:
我知道,为了避免虚假的唤醒调用,将 awhile-loop
放在 a 周围,WaitOne()
以便线程在错误唤醒时再次进入等待模式。
问题:我不明白我应该如何实现故障安全while循环WaitOne()
(这取决于两个条件)。
重要线索:因为每当 XML 文件发生更改时我都会在日志文件上打印,所以我可以说虚假的唤醒呼叫不是因为 FileWatcher。最有可能的是,问题出在 line 上_waitTillXmlChanges.WaitOne(waitTillNextWakeUpDay)
,它无法等待waitTillNextWakeUpDay
(大约 1 天)的时间跨度,并且每 15-30 分钟就会醒来。
上面的代码在我的 PC 上可以正常工作,但在另一台 PC 上出现了虚假唤醒的问题。
c++ - 线程安全队列和虚假唤醒
我目前正在阅读一本关于 C++ 中的多线程的书。在一章中,我找到了一些线程安全队列的源代码。它大致是这样构建的:
当一个值被推入队列时,会通知数据条件,并且 pop 中的一些(可能)等待线程可以恢复工作。在这种情况下,让我感到困惑的是虚假的唤醒。如果在通知一个线程的同时,另一个线程同时唤醒了怎么办?当然,他也看到了一个非空队列。在这种情况下,两个不同的线程会尝试弹出一个值,其中可能只存在一个值 - 一个经典的竞争条件。
我在这里错过了什么吗?有一个更好的方法吗?
c++ - 一般来说,处理虚假唤醒的正确方法是什么?
在以下选项中,在使用条件变量时是否有任何正确的方法来处理虚假唤醒?
1)使用布尔值将其wait(unique_lock_ul)
放入无限循环while
2) 与 if 相同
3) 在 中放置一个条件wait()
,例如使用 lambda 函数
如果这些都不正确,如何轻松处理虚假唤醒?
我对 C++ 中的条件变量相当陌生,我不确定我阅读的某些代码是否处理虚假唤醒的情况。
c - 包含 pthread_cond_wait 的 while 循环的行为是什么?
我想知道while
等待线程被唤醒后会发生什么。
为了避免“虚假唤醒”,pthreads
文档指出您需要pthread_cond_wait
在while
语句中使用。
因此,当pthread_cond_wait
调用 时,调用线程被阻塞。发出信号后,线程在while
.
在我的代码中,我正在处理pthread_cond_wait()
这种方式:
问题是,它会尝试再次进入一段时间,还是以某种方式进入一段break
时间并继续?或者,在那种情况下,break
之后pthread_cond_wait()
是必要的?
python - threading.Event() 对象是否遭受虚假唤醒?
在 C 中,pthread 条件变量的用途与threading.Event()
python 中的变量相同。我的问题是,threading.Event()
变量是否会遭受与 pthread 条件变量相同的虚假唤醒问题?