Linux虚假唤醒

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

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

伪代码实现

(以下代码来自pthread_cond_broadcast的man 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_wait、pthread_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博客

相关推荐

  1. Linux虚假唤醒

    2023-12-07 15:40:05       45 阅读
  2. 什么是虚假唤醒?为什么会产生虚假唤醒

    2023-12-07 15:40:05       20 阅读
  3. linux下 罗技鼠标睡眠唤醒问题的解决

    2023-12-07 15:40:05       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 15:40:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 15:40:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 15:40:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 15:40:05       20 阅读

热门阅读

  1. Python【走出棋盘】

    2023-12-07 15:40:05       32 阅读
  2. entos7系统部署elastic6.4.3版本集群

    2023-12-07 15:40:05       36 阅读
  3. Vue3组件中使用ref解决GetElementById为空的问题

    2023-12-07 15:40:05       38 阅读
  4. Vue中下载不同文件的几种方式

    2023-12-07 15:40:05       43 阅读
  5. 微信小程序中 不同页面如何传递参数

    2023-12-07 15:40:05       43 阅读
  6. STM32关键词提取

    2023-12-07 15:40:05       36 阅读
  7. 1.求两个数最大值

    2023-12-07 15:40:05       37 阅读
  8. Python里的OS模块

    2023-12-07 15:40:05       32 阅读
  9. Rust语言项目实战(九 - 完结) - 胜利与失败

    2023-12-07 15:40:05       35 阅读
  10. Ubuntu 安装高版本FFmpeg

    2023-12-07 15:40:05       48 阅读
  11. CSS选择器看一篇就够了

    2023-12-07 15:40:05       41 阅读