实际发生虚假的唤醒吗?

问题:

看到各种锁定相关的问题,(几乎)总是发现“循环,因为虚假的唤醒”术语1我想知道,有没有人经历过这样的唤醒(假设一个体面的硬件/软件环境)?
我知道“虚假”这个词意味着没有明显的理由,但这样的事件的原因可能如何呢?
 1注意:我没有质疑循环的做法。)
 编辑:一个帮助问题(对于那些喜欢代码示例的人):
如果我有以下程序,我运行它:

public class Spurious {
    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        Condition cond = lock.newCondition();
        lock.lock();
        try {
            try {
                cond.await();
                System.out.println("Spurious wakeup!");
            } catch (InterruptedException ex) {
                System.out.println("Just a regular interrupt.");
            }
        } finally {
            lock.unlock();
        }
    }
}

我可以做什么来唤醒这个await虚假,而不用永远等待随机事件?

回答:

维基百科article on spurious wakeups有这个tidbit:

Linux中的pthread_cond_wait()功能是使用futex系统调用实现的。当进程收到一个信号时,Linux上的每个阻塞系统调用在EINTR突然返回。 … pthread_cond_wait()无法重新启动等待,因为它可能会在futex系统调用之外的一小段时间内错过真正的唤醒。这种竞争条件只能由呼叫者检查不变量来避免。因此,POSIX信号将产生一个虚假的唤醒。

 概要:如果一个Linux进程发出信号,其等待的线程将会喜欢一个很好的热门spurious wakeup
我买它。这是一个更容易吞咽的药丸,而不是通常给出的通常含糊的“这是表现”的原因。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Do spurious wakeups actually happen?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

20 + = 24