问题标签 [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.

0 投票
7 回答
38895 浏览

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?

0 投票
4 回答
6282 浏览

c++ - condition_variable::wait_for() 如何处理虚假唤醒?

各种平台都允许虚假唤醒。为了解决这个问题,我们写了下面的循环机制:

同样的事情是可以理解的conditional_variable::wait_until()
但看看下面的例子:

想象一下,虚假唤醒发生在 1 秒。尚未达到超时。
它会再等10秒吗?这将导致无限循环,我确信这不应该发生。从源代码,内部wait_for()调用wait_until().

我想了解,如何wait_for()处理虚假唤醒?

0 投票
3 回答
1609 浏览

c++ - 什么时候可以在没有谓词的情况下使用 std::condition_variable?

如果std::condition_variable可以由于虚假唤醒而发出信号(并且我们不能确定我们需要的条件是否真的得到满足),为什么 C++ 标准库提供wait()没有谓词的方法重载?可以使用这种行为的场景是什么?

0 投票
2 回答
140 浏览

java - 意外的线程唤醒

我期待以下示例中的第二个线程挂起,因为它等待一个没有相应通知的对象。相反,它通过了 println,大概是由于虚假唤醒。

输出:

另一方面,如果删除“嘿!” println 从第一个线程,第二个线程确实会挂起。这发生在 MacOS 和 Linux 上。

知道为什么吗?

0 投票
1 回答
449 浏览

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 上出现了虚假唤醒的问题。

0 投票
2 回答
307 浏览

c++ - 线程安全队列和虚假唤醒

我目前正在阅读一本关于 C++ 中的多线程的书。在一章中,我找到了一些线程安全队列的源代码。它大致是这样构建的:

当一个值被推入队列时,会通知数据条件,并且 pop 中的一些(可能)等待线程可以恢复工作。在这种情况下,让我感到困惑的是虚假的唤醒。如果在通知一个线程的同时,另一个线程同时唤醒了怎么办?当然,他也看到了一个非空队列。在这种情况下,两个不同的线程会尝试弹出一个值,其中可能只存在一个值 - 一个经典的竞争条件。

我在这里错过了什么吗?有一个更好的方法吗?

0 投票
1 回答
104 浏览

java - Java:这是否正确地暂停了线程?

我很好奇是否可以通过运行以下暂停代码来暂停tJava 中的线程并允许另一个线程稍后恢复它:t

t然后通过调用它来恢复线程.interrupt()。但是,我读过关于虚假唤醒的文章,所以我想知道我的代码是否会失败,即退出 while 循环,尽管没有其他线程调用.interrupt()它。虽然这个答案这个答案表明没有虚假中断,因此我的代码永远不会失败,但 Java 文档似乎没有解决这个问题。我的问题可能归结为是否InterruptedException在线程不被.interrupt(). 是否有任何官方资料或文件可以证实这一点?

0 投票
2 回答
2586 浏览

c++ - 一般来说,处理虚假唤醒的正确方法是什么?

在以下选项中,在使用条件变量时是否有任何正确的方法来处理虚假唤醒?

1)使用布尔值将其wait(unique_lock_ul)放入无限循环while

2) 与 if 相同

3) 在 中放置一个条件wait(),例如使用 lambda 函数

如果这些都不正确,如何轻松处理虚假唤醒?

我对 C++ 中的条件变量相当陌生,我不确定我阅读的某些代码是否处理虚假唤醒的情况。

0 投票
1 回答
467 浏览

c - 包含 pthread_cond_wait 的 while 循环的行为是什么?

我想知道while等待线程被唤醒后会发生什么。

为了避免“虚假唤醒”,pthreads文档指出您需要pthread_cond_waitwhile语句中使用。

因此,当pthread_cond_wait调用 时,调用线程被阻塞。发出信号后,线程在while.

在我的代码中,我正在处理pthread_cond_wait()这种方式:

问题是,它会尝试再次进入一段时间,还是以某种方式进入一段break时间并继续?或者,在那种情况下,break之后pthread_cond_wait()是必要的?

0 投票
0 回答
160 浏览

python - threading.Event() 对象是否遭受虚假唤醒?

在 C 中,pthread 条件变量的用途与threading.Event()python 中的变量相同。我的问题是,threading.Event()变量是否会遭受与 pthread 条件变量相同的虚假唤醒问题?