信号量或互斥锁

在使用信号量或互斥锁时,调用mutex_locksem_wait的程序会被挂起,进入等待状态,直到另一个线程调用unlocksem_post来唤醒它。这种等待不是死循环,也不会一直消耗 CPU。

具体来说,当一个线程调用mutex_locksem_wait时,如果锁或信号量当前不可用(已被其他线程持有),该线程将被放入等待队列,并处于阻塞状态,不再消耗 CPU 资源。当其他线程释放了锁或增加了信号量的计数值时,系统会从等待队列中选择一个等待的线程唤醒它,使其继续执行。

这种唤醒机制通常是由操作系统或线程库来实现的,具体实现方式可能涉及线程调度算法和底层的系统调用。这种方式保证了线程在获取锁或信号量时的阻塞操作是高效的,不会导致 CPU 资源的浪费。


当一个线程调用mutex_locksem_wait时,如果锁或信号量当前不可用,该线程会被阻塞,并加入到等待该锁或信号量的等待队列中。这个等待队列是由操作系统或线程库维护的。

具体的工作流程如下:

  1. 线程调用mutex_locksem_wait:当一个线程想要获得一个互斥锁或信号量时,它会调用相应的函数(如mutex_locksem_wait)。

  2. 检查锁或信号量状态:系统会检查锁或信号量的状态。如果锁已经被其他线程持有,或者信号量的计数值不足以满足当前线程的需求,那么当前线程将被放入等待队列。

  3. 加入等待队列:线程被放入等待队列后,它将被挂起,不再消耗 CPU 资源。等待队列中的线程按照某种策略进行排列,通常是先进先出(FIFO)或优先级队列。

  4. 等待其他线程释放锁或增加信号量的计数值:在等待队列中的线程会等待其他线程释放锁或增加信号量的计数值。一旦锁被释放或信号量的计数值被增加,等待队列中的某个线程就会被唤醒。

  5. 唤醒等待的线程:唤醒线程的工作通常由操作系统或线程库完成。一旦有其他线程释放了锁或增加了信号量的计数值,操作系统会从等待队列中选择一个等待的线程唤醒它,并将其状态从阻塞状态改变为就绪状态,使其可以继续执行。

总的来说,等待队列的管理和线程的唤醒是由操作系统或线程库来完成的,这样可以确保线程的阻塞和唤醒操作是高效而正确的。

参考:互斥锁的实现原理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubernetes(K8S)学习(五):K8S进阶(Lifecycle......偏理论)

K8S进阶(Lifecycle......偏理论) 一、Pod进阶学习之路1.1 Lifecycle1.2 重启策略1.3 静态Pod1.4 健康检查1.5 ConfigMap1.6 Secret1.7 指定Pod所运行的Node 二、Controller进阶学习之路2.1 Job & CronJob2.2 StatefulSet2.3 DaemonSet2.4 Horizontal…

Adobe Illustrator 2023 for Mac/Win:创意无限,设计无界

在数字艺术与设计领域,Adobe Illustrator 2023无疑是一颗璀璨的明星。这款专为Mac和Windows用户打造的矢量图形设计软件,以其强大的功能和卓越的性能,赢得了全球设计师的广泛赞誉。 Adobe Illustrator 2023在继承前代版本优点的基础上&#…

python——遍历网卡并禁用/启用

一、遍历网卡 注意:只能遍历到启用状态的网卡,如果网卡是禁止状态,则遍历不到!!! import os import time import psutil import loggingdef get_multi_physical_network_card():physical_nic_list []try:…

线性代数笔记25--复数矩阵、快速傅里叶变换

1. 复数矩阵 复向量 Z [ z 1 z 2 z 3 z 4 ⋯ ] Z\begin{bmatrix} z_1\\z_2\\z_3\\z_4\\ \cdots \end{bmatrix} Z ​z1​z2​z3​z4​⋯​ ​ 复向量的模长 ∣ z ∣ z ‾ ⊤ z [ z ‾ 1 z ‾ 2 z ‾ 3 ] [ z 1 z 2 z 3 ] \lvert z\rvert\overline z^{\top}z \begin{bmatrix…

鸿蒙 UIAbility和Compent 生命周期

一、UIAbility的生命周期 在UIAbility的使用过程中,会有多种生命周期状态,掌握UIAbility的生命周期,对于应用的开发非常重要。 1、UIAbility的生命周期 UIAbility的生命周期主要分为以下4个: Create---Foreground---Background---…

【Golang星辰图】数据处理的航海家:征服数据海洋的航行工具

数据处理的建筑师:用Go语言中构建稳固的数据分析建筑物 前言 数据处理和分析是现代计算机科学中的关键任务之一,而Go语言作为一门现代化的编程语言,也需要强大的数据处理和分析库来支持其在这一领域的应用。本文将介绍几款优秀的数据处理和…

多模态大模型:解析未来智能汽车的新引擎

多模态大模型:解析未来智能汽车的新引擎 1. 多模态大模型简介2. 多模态大模型在智能汽车中的应用2.1 感知与认知2.2 智能驾驶辅助2.3 智能交互 随着人工智能技术的不断进步,智能汽车已经从概念变成了现实,成为了当今科技领域的焦点之一。而在…

大模型预测,下一个token何必是文字?

太快了太快了… 大模型的生成技能,已经到了普通人看不懂的境界! 它可以根据用户过去5年的体检报告,生成未来第1年、第2年、第3年的体检报告。 你看,这个生成的过程,是不是像极了ChatGPT,根据历史单词预测…

顺序栈、链式栈、顺序队列、链式队列的ADT及其实现

顺序栈ADT及其实现 链式栈ADT及其实现 顺序队列的ADT及其实现 在数组中队首队尾的分配方案 第三中方案,即达到入队出队操作的时间代价是O(1) 同时可充分利用空间,不会出现空间似乎用完了的假象 时间性能和空间性能发挥到最大 链…

快速上手Spring Cloud 九:服务间通信与消息队列

快速上手Spring Cloud 一:Spring Cloud 简介 快速上手Spring Cloud 二:核心组件解析 快速上手Spring Cloud 三:API网关深入探索与实战应用 快速上手Spring Cloud 四:微服务治理与安全 快速上手Spring Cloud 五:Spring …

短视频矩阵系统---开发源头交付

短视频矩阵系统---开发源头交付 短视频矩阵系统的核心开发步骤包括以下几个方面: 1. 系统设计:根据需求分析,设计出相应的系统架构,包括数据库设计、系统功能模块设计等。 2. 开发基础功能:基础功能包括短视频的上传、…

数据库工具——DBeaver的安装及使用

目录 一、DBeaver介绍 1.定义 2.支持的数据库 3.支持的操作系统 4.特点 二、DBeaver安装及使用 1.服务启动 2.查看连接类型 3.演示连接Mysql数据库 4.连接配置 5.成功连接 6.远程控制 6.1新建数据库 6.2新建数据表 6.3添加字段列 6.4使用SQL编辑器进行编辑 一…

版本 23.0.0 , docker 安装 , docker目录迁移正确方法

docker 安装 docker 安装, https://docs.docker.com/engine/install/ubuntu/ # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.do…

前端理论总结(jq)——jQuery九种选择器

(1)、基本选择器 #id,class,element,* (2)、层次选择器 parent > child,prev next ,prev ~ siblings (3)、基本过滤器选择器 :first,:last ,:not ,:even ,:odd &…

吉时利KEITHLEY2460数字源表

181/2461/8938产品概述: Keithley 2460 高电流源表源测量单元 (SMU) 将先进的触摸、测试和发明技术带到您的指尖。Keithley 2460 将创新的图形用户界面 (GUI) 与电容式触摸屏技术相结合,使测试变得直观并最大限度地缩短学习曲线,从而帮助工程…

提取单选框的值,并通过ajax传值到后台

<!DOCTYPE html> <html lang"zh" xmlns:th"http://www.thymeleaf.org" xmlns:shiro"http://www.pollix.at/thymeleaf/shiro"> <head><th:block th:include"include :: header(日库存更新提示)" /> </head&…

双向长短期BiLSTM的回归预测-附MATLAB代码

BiLSTM是一种带有正反向连接的长短期记忆网络&#xff08;LSTM&#xff09;。 BiLSTM通过两个独立的LSTM层&#xff0c;一个按时间顺序处理输入&#xff0c;另一个按时间倒序处理输入&#xff0c;分别从正向和反向两个方向捕捉输入序列的特征。具体地&#xff0c;正向LSTM按时…

蓝桥杯物联网竞赛_STM32L071_13_定时器

CubeMx配置LPTIM: counts internal clock events 计数内部时钟事件 prescaler 预分频器 updata end of period 更新期末 kil5配置&#xff1a; 中断回调函数完善一下&#xff1a; void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim){if(cnt ! 10) cnt…

Python:执行py命令,提示: Can‘t find a default Python.

1.Python运行环境罢工 今天&#xff0c;要运行一个前年用python编写的爬虫程序&#xff0c;先检测python运行环境是否正常&#xff1a; D:\Python38-32\works>c:\windows\py.exe Cant find a default Python. 再试&#xff1a; D:\Python38-32\works>py --list Installe…

c++数字和字符串的转化

std::to_string 可以将各种类型的数字转换为字符串,而 std::stoi 则可以将字符串转换为整数。 std::to_string 函数原型:std::string to_string( T value ); 功能:将各种类型的数字转换为对应的字符串。 参数: value:要转换为字符串的数字,可以是整数类型(如int、long、…