关键段,事件,互斥量,信号量的“遗弃”问题

RK3568平台 麦克风PDM接口录音_rk pdm配置 在RK平台,Android的Audio HAL层中一般会都会有导出录音播放数据的功能。如播放的,是会直接送到声卡中的,对于播放出现问题的情况,可以从分析导出的音频数据是否正常,可以基本知道,是在应用、解码出现的问题,还是送到声卡过程中出现问题。当点开app进行录音的时候会调用到static int start_input_stream(struct stream_in *in)。音频在PDM接口输入,不经过编解码芯片直接到RK主芯片,RK主芯片自带PCM编解码功能。以下软件能播放保存下来的pdm文件。 阅读详情

一.什么是“遗弃”问题

互斥量常用于多进程之间的线程互斥,所以它比关键段还多一个很有用的特性——“遗弃”情况的处理。比如有一个占用互斥量的线程在调用ReleaseMutex()触发互斥量前就意外终止了(相当于该互斥量被“遗弃”了),那么所有等待这个互斥量的线程是否会由于该互斥量无法被触发而陷入一个无穷的等待过程中了?这显然不合理。因为占用某个互斥量的线程既然终止了那足以证明它不再使用被该互斥量保护的资源,所以这些资源完全并且应当被其它线程来使用。因此在这种“遗弃”情况下,系统自动把该互斥量内部的线程ID设置为0,并将它的递归计数器复置为0,表示这个互斥量被触发了。然后系统将“公平地”选定一个等待线程来完成调度(被选中的线程的WaitForSingleObject()会返回WAIT_ABANDONED_0)。

可见“遗弃”问题就是——占有某种资源的进程意外终止后,其它等待该资源的进程能否感知。

 

二.关键段的“遗弃”问题

关键段在这个问题上很简单——由于关键段不能跨进程使用,所以关键段不需要处理“遗弃”问题。

 

三.事件,互斥量,信号量的“遗弃”问题

事件,互斥量,信号量都是内核对象,可以跨进程使用。一个进程在创建一个命名的事件后,其它进程可以调用OpenEvent()并传入事件的名称来获得这个事件的句柄。因此事件,互斥量和信号量都会遇到“遗弃”问题。我们已经知道互斥量能够处理“遗弃”问题,接下来就来看看事件和信号量是否能够处理“遗弃”问题。类似于《秒杀多线程第七篇 经典线程同步互斥量Mutex》对互斥量所做的试验,下面也对事件和信号量作同样的试验:

1. 创建二个进程。

2. 进程一创建一个初始为未触发的事件,然后等待按键,按下y则触发事件后结束进程,否则直接退出表示进程一已意外终止。

3. 进程二先获得事件的句柄,然后调用WaitForSingleObject()等待这个事件10秒,在这10秒内如果事件已经触发则输出“已收到信号”,否则输出“未在规定的时间内收到信号”。如果在等待的过程中进程一意外终止,则输出“拥有事件的进程意外终止”。信号量的试验方法类似。

为了加强对比效果,将互斥量的试验结果先展示出来(代码请参见《秒杀多线程第七篇经典线程同步 互斥量Mutex》)

可以看出在第一个进程在没有触发互斥量就直接退出的情况下,等待这个互斥量的第二个进程是能够感知进程一所发生的意外终止的。

接下来就先完成事件的“遗弃”问题试验代码。

进程一:

#include <stdio.h>
#include <conio.h>
#include <windows.h>
const TCHAR STR_EVENT_NAME[] = TEXT("Event_MoreWindows");
int main()
{
	printf("     经典线程同步 事件的遗弃处理  进程一\n");  
	printf(" -- by MoreWindows( http://blog.youkuaiyun.com/MoreWindows ) --\n\n");  
	HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, STR_EVENT_NAME);//自动置位 当前未触发
	printf("事件已经创建,现在按y触发事件,按其它键终止进程\n");
	char ch;
	scanf("%c", &ch);
	if (ch != 'y')
		exit(0); //表示进程意外终止
	SetEvent(hEvent);
	printf("事件已经触发\n");
	CloseHandle(hEvent);
	return 0;
}
进程二:

#include <stdio.h>
#include <windows.h>
const TCHAR STR_EVENT_NAME[] = TEXT("Event_MoreWindows");
int main()
{
	printf("     经典线程同步 事件的遗弃处理  进程二\n");  
	printf(" -- by MoreWindows( http://blog.youkuaiyun.com/MoreWindows ) --\n\n");  

	HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, TRUE, STR_EVENT_NAME); //打开事件
	if (hEvent == NULL)
	{
		printf("打开事件失败\n");
		return 0;
	}
	printf(" 等待中....\n");
	DWORD dwResult = WaitForSingleObject(hEvent, 10 * 1000); //等待事件被触发
	switch (dwResult)
	{
	case WAIT_ABANDONED:
		printf("拥有事件的进程意外终止\n");
		break;

	case WAIT_OBJECT_0:
		printf("已经收到信号\n");
		break;

	case WAIT_TIMEOUT:
		printf("未在规定的时间内收到信号\n");
		break;
	}
	CloseHandle(hEvent);
	return 0;
}

事件Event试验结果1-进程一触发事件后正常结束:

事件Event试验结果2-进程一意外终止:

可以看出进程二没能感知进程一意外终止,说明事件不能处理“遗弃”问题。

 

下面再来试下信号量。

信号量的“遗弃”问题试验代码:

进程一:

#include <stdio.h>
#include <conio.h>
#include <windows.h>
const TCHAR STR_SEMAPHORE_NAME[] = TEXT("Semaphore_MoreWindows");
int main()
{
	printf("     经典线程同步 信号量的遗弃处理  进程一\n");  
	printf(" -- by MoreWindows( http://blog.youkuaiyun.com/MoreWindows ) --\n\n");  

	HANDLE hSemaphore = CreateSemaphore(NULL, 0, 1, STR_SEMAPHORE_NAME);//当前0个资源,最大允许1个同时访问
	printf("信号量已经创建,现在按y触发信号量,按其它键终止进程\n");
	char ch;
	scanf("%c", &ch);
	if (ch != 'y')
		exit(0); //表示进程意外终止
	ReleaseSemaphore(hSemaphore, 1, NULL);
	printf("信号量已经触发\n");
	CloseHandle(hSemaphore);
	return 0;
}
进程二:

#include <stdio.h>
#include <windows.h>
const TCHAR STR_SEMAPHORE_NAME[] = TEXT("Semaphore_MoreWindows");
int main()
{
	printf("     经典线程同步 信号量的遗弃处理  进程二\n");  
	printf(" -- by MoreWindows( http://blog.youkuaiyun.com/MoreWindows ) --\n\n");  

	HANDLE hSemaphore = OpenSemaphore (SEMAPHORE_ALL_ACCESS, TRUE, STR_SEMAPHORE_NAME); //打开信号量
	if (hSemaphore == NULL)
	{
		printf("打开信号量失败\n");
		return 0;
	}
	printf(" 等待中....\n");
	DWORD dwResult = WaitForSingleObject(hSemaphore, 10 * 1000); //等待信号量被触发
	switch (dwResult)
	{
	case WAIT_ABANDONED:
		printf("拥有信号量的进程意外终止\n");
		break;

	case WAIT_OBJECT_0:
		printf("已经收到信号\n");
		break;

	case WAIT_TIMEOUT:
		printf("未在规定的时间内收到信号\n");
		break;
	}
	CloseHandle(hSemaphore);
	return 0;
}

信号量Semaphore试验结果1-进程一触发信号量后正常结束

信号量Semaphore试验结果2-进程一意外终止

可以看出进程二没能感知进程一意外终止,说明信号量与事件一样都不能处理“遗弃”问题。

 

四.“遗弃”问题总结

由本文所做的试验可知,互斥量能够处理“遗弃”情况,事件与信号量都无法解决这一情况。

再思考下互斥量能处理“遗弃”问题的原因,其实正是因为它有“线程所有权”概念。在系统中一旦有线程结束后,系统会判断是否有互斥量被这个线程占有,如果有,系统会将这互斥量对象内部的线程ID号将设置为NULL,递归计数设置为0,这表示该互斥量已经不为任何线程占用,处于触发状态。其它等待这个互斥量的线程就能顺利执行下去了。至于线程如何获取互斥量的“线程所有权”,MSDN上介绍为——A thread obtainsownership of a mutex either by creating it with the bInitialOwnerparameter set toTRUE or by specifying its handle in a call toone of thewait functions.

线性回归LinearRegression 对视频中线性回归算法的相关内容进行总结与记录 文章目录一、理论基础二、实例2.1 一元线性回归2.1.1 推导过程2.1.2 代码实现(基于numpy)2.1.3 代码实现(基于sklearn)2.2 多元线性回归2.2.1 代码实现(基于numpy)2.2.2 代码实现(基于sklearn) 一、理论基础 回归 通常是指利用某个函数,尽可能把数据样本点“串”在一起,用于描述输入变量和输出变量间的变化关系 线性回归 特点:用来把数据“串”起来的那个函数是线性的 (一元线性回归(一个自变量) &a. 阅读详情

相关推荐

Word公式一键转MathType保姆级教程(附omml2mml.xsl报错终极解决方案)

本文提供Word公式一键转MathType的保姆级教程,重点解决常见的omml2mml.xsl报错问题。通过详细分析报错原因、官方解决方案实操步骤及转换后格式优化技巧,帮助用户高效完成公式转换,适用于科研论文和商业文档编辑。

weixin_30082367的博客 556

秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] 秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题 在《秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量》中对经典多线程同步互斥问题进行了回顾和总结,这篇文章对Windows系统下常用的线程同步互斥机制——关键段、事件、互斥量、信号量进行了总结。有网友问到互斥量...

weixin_30632899的博客 152

Mac上IDEA的PlantUML插件报错‘找不到Graphviz’?手把手教你用Homebrew搞定(附阿里云镜像避坑)

本文详细解决了Mac上IDEA的PlantUML插件报错‘找不到Graphviz’的问题,通过Homebrew安装Graphviz并配置阿里云镜像源,特别针对Apple Silicon芯片用户提供了优化方案。文章还涵盖了IDEA中PlantUML插件的正确配置和常见问题排查,帮助开发者高效使用PlantUML进行UML图表设计。

weixin_42619742的博客 469

互斥量的使用,是应用程序只运行一次

转载:http://hi.baidu.com/jenfmo/blog/item/d5a298543da5b35ad009060b.html 正常情况下,一个进程的运行一般是不会影响到其他正在运行的进程的。但是对于某些有特殊要求的如以独占方式使用串行口等硬件设备的程序就要求在其进程运行期间不允许其他试图使用此端口设备的程序运行的,而且此类程序通常也不允许运行同一个程序的多个实例。这就引出了进程互斥

Howard_Liu1314的专栏 2198

智能驾驶感知模块的测试评估方法(上)

对于智能驾驶系统而言,感知模块是开发难度最大、投入资源最多的核心部分。在智能驾驶开发团队内部,感知模块需要独立进行评测才能及早发现潜在缺陷或判断性能是否有改进。随着近几年BEV、OCC、E2E等新技术方案被越来越多企业应用,感知的评测变得越来越艰难,效率也变得越来越低下。本文作者基于在智驾测试行业多年经验,试图总结感知评测的基本规律和效率提升方法,以供读者一些启发。

vincent_321的博客 2559

STM32F103+AX58100 EtherCAT从站SPI移植实战:CubeMX配置避坑指南

本文详细介绍了STM32F103与AX58100 EtherCAT从站控制器的SPI接口移植实战,重点解析CubeMX配置中的关键参数与常见陷阱。内容涵盖硬件连接规范、SPI模式设置、中断优先级规划及协议栈对接技巧,帮助开发者高效实现工业自动化领域的实时通信方案。特别强调CPOL/CPHA配置与AX58100的匹配要求,避免数据错位问题。

weixin_29230865的博客 331

多线程14: 关键段,事件,互斥量,信号量的“遗弃”问题

这篇文章对Windows系统下常用的线程同步互斥机制——关键段、事件、互斥量、信号量进行了总结。有网友问到互斥量能处理“遗弃”问题,事件和信号量是否也能处理“遗弃”问题。因此本文将对事件和信号量作个试验,看看事件和信号量能否处理“遗弃”问题。   一.什么是“遗弃”问题 在《秒杀多线程第七篇 经典线程同步 互斥量Mutex》讲到了互斥量能处理“遗弃”问题,下面引用原文: 互斥量常用于多进程

chlele0105的专栏 1万+

MATLAB - 激光雷达 - 相机联合标定(Lidar-Camera Calibration)

激光雷达传感器和相机通常在自动驾驶应用中结合使用,因为激光雷达传感器收集三维空间信息,而相机则以二维图像捕捉空间的外观和纹理。您可以融合来自这些传感器的数据来改进物体检测和分类。激光雷达-相机标定可以估算出一个变换矩阵,给出两个传感器之间的相对旋转和平移。在进行激光雷达-相机数据融合时,您可以使用该矩阵。本图说明了激光雷达和相机标定 (LCC) 过程的工作流程,我们使用棋盘格作为标定对象。我们从激光雷达和相机数据中提取棋盘角和平面,然后在它们的坐标系之间建立几何关系,进行标定。

机器人控制与仿真应用 7371

秒杀多线程第十四篇 关键段,事件,互斥量,信号量的“遗弃”问题

秒杀多线程第十四篇 关键段,事件,互斥量,信号量的“遗弃”问题 在《秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量》中对经典多线程同步互斥问题进行了回顾和总结,这篇文章对Windows系统下常用的线程同步互斥机制——关键段、事件、互斥量、信号量进行了总结。有网友问到互斥量能处理“遗弃”问题,事件和信号量是否也能处理“遗弃”问题。因此本文将对事件和信号量作个试验,

chenglinhust的专栏 1241

pt100和max31865测室温跳变比较大,会从23.04跳到23.47,23.75反复跳变超过了0.5的误差范围,在VDD和GND之间加上0.1和10的滤波电容也不行,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 2087

CPU 访问外设的两种核心机制:MMIO(Memory-Mapped I/O) 和 DMA(Direct Memory Access)

BAR和DMA是计算机系统中两种关键的数据传输机制:BAR(基址寄存器)用于CPU与设备间的控制通信,映射设备寄存器便于配置操作;而DMA(直接内存访问)允许设备直接读写系统内存,无需CPU参与大量数据传输。典型场景如NVMe SSD读取数据时,CPU通过BAR下发指令,设备通过DMA高效传输数据到主机内存,最后中断通知CPU。虽然BAR能映射大内存空间,但仍无法替代DMA的高效数据传输功能,两者各司其职——BAR负责控制,DMA专注数据传输,共同实现高性能的硬件交互。

MHD0815的博客 237
上一篇: 信号量Semaphore
下一篇: 经典线程同步总结 关键段 事件 互斥量 信号量
雪岢奇
博客等级 码龄17年 310粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值