问题标签 [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 投票
1 回答
112 浏览

java - spurios 唤醒是否伴随着 InterruptedException?

Object.wait用于提及的 javadoc ,

与单参数版本一样,中断和虚假唤醒是可能的,并且此方法应始终在循环中使用。

它没有提到InterruptedException这里需要处理 a 。这是否意味着等待方法可能会自发唤醒而不会抛出一个。

我环顾四周,但没有找到任何关于唤醒实际处理方式的具体信息。

由于虚假中断不是一件事(或者我已经读过),我相信情况就是如此。我只是在寻找对此的确认。

0 投票
2 回答
131 浏览

c++ - 虚假唤醒是否会解除所有等待线程的阻塞,甚至是不相关的线程?

我对 C++ 中的多线程仍然很陌生,我目前正试图围绕“虚假唤醒”以及导致它们的原因。我已经对条件变量、内核信号、futex 等进行了一些挖掘,并发现了一些关于“虚假唤醒”为何以及如何发生的罪魁祸首,但仍有一些我无法找到答案。 .

问题:虚假唤醒是否会解除所有等待/阻塞线程的阻塞,甚至是等待完全不相关通知的线程?或者阻塞线程是否有单独的等待队列,因此等待另一个通知的线程受到保护?

示例:假设我们有 249 名斯巴达人等待攻击波斯人。他们wait()为他们的领袖列奥尼达斯(第 250 人)要notify_all()何时进攻。现在,在营地的另一边,有 49 名受伤的斯巴达人正在等待医生(第 50 名)来notify_one()治疗每个人。虚假的唤醒会解除所有等待的斯巴达人,包括受伤的斯巴达人,还是只会影响等待战斗的人?等待线程有两个单独的队列,还是只有一个?

如果该示例具有误导性,我深表歉意……我不知道如何解释它。

0 投票
1 回答
38 浏览

multithreading - POSIX 条件变量 VS Win32 Event Objects(关于虚假唤醒问题)

在 POSIX 中,由于“虚假唤醒”问题,程序员在检查条件时被迫使用while()而不是。if

我认为虚假唤醒是不直观且令人困惑的问题,但我认为这是一个不可避免的问题。

最近发现win32的事件对象不存在“虚假唤醒”的问题。

为什么 POSIX 系统和其他系统仍然使用具有“虚假唤醒”问题的条件变量?(尽管这可以解决?)

0 投票
2 回答
53 浏览

c++ - 如何避免没有谓词的虚假唤醒?

我有一个线程让我们称之为 t1,它会在 x 秒后定期发送一些东西。这个“x 秒部分”可以从其他线程 (t2)更改。我应该能够从线程 t1 执行以下操作。

  1. 等待“x 秒”然后发送一些东西
  2. 如果线程 t2 发送另一个 "x" 值,则不要发送,而是转到第 1 步。

我为此目的使用了条件变量 wait_for()

我只想在“x 秒”结束时发送。

目前我已经在没有谓词的情况下实现了它(因为我不需要它)是这样的:

但有时我会在 timeout 之前看到“发送发生”,我认为这是由于虚假唤醒和缺少谓词造成的。

我的问题是如何在没有谓词的情况下处理虚假唤醒?我应该为此采取另一种方法吗?我不需要谓词,因为线程 t1 在特定条件下休眠(当 x 为 0 时)并且我希望它(t1)在没有任何条件的情况下被 t2 唤醒。

这是我第一个使用 cond 变量的任务,我还在学习 CPP,提前谢谢你。

0 投票
1 回答
36 浏览

java - 有什么好方法可以区分虚假唤醒和 Thread.interrupt() 吗?

我想创建一个可以随时中断的线程,同时防止虚假唤醒。这里的问题是虚假唤醒和中断的工作方式相同:它们抛出InterruptedException

从中我看到,没有办法仅仅用jdk来区分它们,甚至Condition没有。我看到的唯一可能的解决方案是为volatile boolean每个线程使用一些额外的东西,但这Thread.interrupt()本身就变得毫无用处。