本文介绍: 为什么会有虚假唤醒一说。Linux内核这么强大,怎么会出现这样的情况?一直以来也很困惑,看了下文链接中的介绍后,豁然开朗。

什么会有虚假唤醒一说。Linux内核这么强大,怎么会出现这样的情况?一直以来也很困惑,看了下文链接中的介绍后,豁然开朗。

计算机设计角度,如果一层解决不了,那就再多加一层。推算到这里就是在表层看不明白时,就需要更深入一层,看它的实现逻辑是怎么样的。

代码实现

(以下代码来自pthread_cond_broadcastman page

pthread_cond_wait(mutex, cond)
{
    value = cond->value; /* 1 */
    pthread_mutex_unlock(mutex); /* 2 */
    pthread_mutex_lock(cond->mutex); /* 10 */
    if (value == cond->value) { /* 11 */
        me->next_cond = cond->waiter;
        cond->waiter = me;
        pthread_mutex_unlock(cond->mutex);
        unable_to_run(me);
    } else {
        pthread_mutex_unlock(cond->mutex); /* 12 */
    }
    pthread_mutex_lock(mutex); /* 13 */
}

pthread_cond_signal(cond)
{
    pthread_mutex_lock(cond->mutex); /* 3 */
    cond->value++; /* 4 */
    if (cond->waiter) { /* 5 */
        sleeper = cond->waiter; /* 6 */
        cond->waiter = sleeper->next_cond; /* 7 */
        able_to_run(sleeper); /* 8 */
    }
    pthread_mutex_unlock(cond->mutex); /* 9 */
}

原因分析

按照伪代码实现中的情况,我们同时调用pthread_cond_waitpthread_cond_signal时,并不一定能直接执行序号11(导致该睡眠的线程不睡眠),而是有可能运行序号3到9,之后才能到序号10。

假设A线程调用pthread_cond_wait,B线程调用pthread_cond_signal。从表现上看,是A线程没有睡眠,B线程直接唤起了更早就再在等待的线程(比如线程C)

参考链接:

  1. pthread_cond_broadcast(3p) – Linux manual page (man7.org)
  2. 深入理解条件变量(虚假唤醒)_条件变量虚假唤醒详解博客园-CSDN博客

原文地址:https://blog.csdn.net/VVBBBBB/article/details/134823937

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_48532.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注