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

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.lryc.cn/news/254472.html

相关文章:

  • 倒计时模块复习
  • k8s(三): 基本概念-ReplicaSet与Deployment
  • Linux 的介绍和云服务器上web 程序部署
  • Oauth2.0 学习
  • Elasticsearch:什么是向量数据库?
  • rename--统一的PRF
  • 010-editor破解(1)
  • Ubuntur编译ROS报错:error PCL requires C++14 or above
  • 17.认识下Docker之docker的核心原理(2)
  • 【EasyExcel实践】万能导出,一个接口导出多张表以及任意字段(可指定字段顺序)
  • 代码随想录算法训练营第四十二天 _ 动态规划_01背包问题、416.分割等和子集。
  • 市场上好用的aspera替代方案,你知道哪些
  • Stm32_串口的帧(不定长)数据接收
  • L0、Linux常用命令
  • Golang实践录:读取toml配置
  • 超大规模集成电路设计----基于阵列的可编程逻辑(七)
  • 深入探索FastAPI单元测试:使用TestClient轻松测试你的API
  • 基于ssm小型企业办公自动化系统论文
  • CasADi - 最优控制开源 Python/MATLAB 库
  • Java中使用String字符串的注意事项
  • 离线数仓构建案例一
  • nginx优雅如何优雅的接管【跨域配置】
  • 远离危险的购买手机的渠道
  • 外包干了2个多月,技术明显有退步了。。。。。
  • 【Java项目管理工具】Maven
  • solidity案例详解(六)服务评价合约
  • 使用kubeadm搭建高可用的K8s集群
  • C#图像处理OpenCV开发指南(CVStar,07)——通用滤波(Filter2D)的实例代码
  • c++函数模板STL详解
  • Java利用UDP实现简单群聊