当前位置: 首页 > article >正文

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博客

http://www.kler.cn/a/160711.html

相关文章:

  • jmeter介绍、使用方法、性能测试、现参数化和数据驱动、分布式测试、压力测试、接口测试
  • 3D绘制动态爱心Matlab
  • jmeter常用配置元件介绍总结之后置处理器
  • 前端--> nginx-->gateway产生的跨域问题分析
  • 华为机试HJ39 判断两个IP是否属于同一子网
  • MTSET可溶于DMSO、DMF、THF等有机溶剂,并在水中有轻微的溶解性,91774-25-3
  • Unity传送门特效: The Beautiful Portal/Level up/Teleport/Warp VFX
  • 网络安全缓冲区溢出实验
  • Linux C语言 37- 进程间通信IPC
  • Python读写txt文件数据
  • vue管理系统模版
  • 编织魔法世界——计算机科学的奇幻之旅
  • [C++] new和delete
  • 自定义插件vue-router简单实现hashRouter设计思路
  • linux常用快捷键
  • 学习mysql记录
  • 说说react的事件机制?
  • Isaac Sim教程08 独立代码编程
  • C# WPF上位机开发(会员管理软件)
  • 启用属性,索引和存储的用途是什么?
  • Elasticsearch:什么是大语言模型(LLM)?
  • HarmonyOS开发(十):通知
  • React立即更新DOM
  • 备案小技能:ICP备案(网站、app、小程序)经营性ICP备案(增值电信业务经营许可证)
  • 【PyTorch】训练过程可视化
  • c语言上机小练(有点难)