互斥信号量

article/2025/9/17 17:23:45

目录

1、Creat

2、Delete

3、Wait

4、Post

5、Statu


互斥信号量

在介绍二进制信号量时,曾讨论到如果二进制信号量创建时设置参数 bInitValue 为TRUE,则可以用于互斥访问共享资源。实际上,SylixOS 的二进制信号量实现的互斥性是将一个变量初始化标记为 1,等待信号量(Wait)时将该变量减 1(此时等于 0),如果另一个线程再次等待该信号量将阻塞,直到该信号量被释放(变量加 1),这样就实现了共享资源的互斥访问。

如果系统中只有两个线程,上面的过程是没有问题的。但是一旦有多个线程介入,上面过程将出现以下问题:

一个高优先级的线程可能也要访问同一个共享资源(这是完全有可能的),此时只能阻塞等待,但是可能会有另一个中等优先级的线程将占有信号量的线程抢占。这个过程导致了高优先级线程很长时间得不到运行(这是 SylixOS 不允许出现的情况)。

以上过程出现的问题就是经典的优先级反转问题。

互斥信号量用于共享资源需要互斥访问的场合,可以理解为初始值为 TRUE 的带优先级天花板和优先级继承机制(意在解决优先级反转问题)的二进制信号量,只有拥有互斥信号量的线程才有权释放互斥信号量。

 

1、Creat

一个 SylixOS 互斥信号量必须要调用 Lw_SemaphoreM_Create 函数创建之后才能使用,如果创建成功,该函数将返回一个互斥信号量的句柄。

#include <SylixOS.h>
LW_HANDLE Lw_SemaphoreM_Create(CPCHAR pcName,UINT8 ucCeilingPriority,ULONG ulOption,LW_OBJECT_ID *pulId);

函数 Lw_SemaphoreM_Create 原型分析:

  • 此函数成功返回互斥信号量的句柄,失败返回 NULL 并设置错误号;
  • 参数 pcName 是互斥信号量的名字;
  • 参数 ucCeilingPriority 在使用优先级天花板算法时有效,此参数为天花板优先级;
  • 参数 ulOption 是互斥信号量的创建选项;
  • 输出参数 pulId 返回互斥信号量的句柄(同返回值),可以为 NULL

创建选项包含了二进制信号的创建选项,此外还可以使用,如下表所示的互斥信号量特有的创建选项。

需要注意,LW_OPTION_INHERIT_PRIORITY 和 LW_OPTION_PRIORITY_CEILING只能二选一,同样 LW_OPTION_NORMAL LW_OPTION_ERRORCHECK 及LW_OPTION_RECURSIVE 只能三选一。

2、Delete

一个不再使用的互斥信号量,可以调用以下函数将其删除。删除后的信号量系统自动回收其占用的系统资源(试图使用被删除的互斥信号量将出现未知的错误)

#include <SylixOS.h>
ULONG Lw_SemaphoreM_Delete(LW_HANDLE *pulId);
函数 Lw_SemaphoreM_Delete 原型分析:
  • 此函数返回错误号;
  • 参数 pulId 是互斥信号量的句柄。
     

3、Wait

线程如果需要等待一个互斥信号量,可以调用 Lw_SemaphoreM_Wait 函数。

#include <SylixOS.h>
ULONG Lw_SemaphoreM_Wait(LW_HANDLE ulId, ULONG ulTimeout);

函数 Lw_SemaphoreM_Wait 原型分析:

  • 此函数成功返回 0,失败返回错误号;
  • 参数 ulId 是互斥信号量的句柄;
  • 参数 ulTimeout 是等待的超时时间,单位为时钟嘀嗒 Tick

4、Post

释放一个互斥信号量使用 Lw_SemaphoreM_Post 函数。
#include <SylixOS.h>
ULONG Lw_SemaphoreM_Post(LW_HANDLE ulId);

函数 Lw_SemaphoreM_Post 原型分析:

  • 此函数成功返回 0,失败返回错误号;
  • 参数 ulId 是互斥信号量的句柄。

需要注意的是,只有互斥信号量的拥有者才能释放该互斥信号量。

5、Statu

下面函数可以获得互斥信号量的状态信息。
#include <SylixOS.h>
ULONG Lw_SemaphoreM_Status(LW_HANDLE ulId,BOOL *pbValue,ULONG *pulOption,ULONG *pulThreadBlockNum);
ULONG Lw_SemaphoreM_StatusEx(LW_HANDLE ulId,BOOL *pbValue,ULONG *pulOption,ULONG *pulThreadBlockNum,LW_HANDLE *pulOwnerId);
以上两个函数原型分析:
  • 函数成功返回 0,失败返回错误号;
  • 参数 ulId 是互斥信号量的句柄;
  • 输出参数 pbValue 用于接收互斥信号量当前的状态;
  • 输出参数 pulOption 用于接收互斥信号量的创建选项;
  • 输出参数 pulThreadBlockNum 用于接收当前阻塞在该互斥信号量的线程数。
  • 输出参数 pulOwnerId 用于接收当前拥有该互斥信号量的线程的句柄。
获得一个互斥信号量的名字,可以调用以下函数:
#include <SylixOS.h>
ULONG Lw_SemaphoreM_GetName(LW_HANDLE ulId, PCHAR pcName);
函数 Lw_SemaphoreM_GetName 原型分析:
  • 此函数成功返回 0,失败返回错误号;
  • 参数 ulId 是互斥信号量的句柄;
  • 输出参数 pcName 是互斥信号量的名字,pcName 应该指向一个大小为LW_CFG_OBJECT_NAME_SIZE 的字符数组。

http://chatgpt.dhexx.cn/article/kPiD3Uw0.shtml

相关文章

UCOS-III 互斥量

互斥量 一、互斥量基本概念二、互斥量优先级继承机制三、互斥量应用场景四、互斥量运作机制五、互斥量创建流程1、定义互斥量2、创建互斥量 六、互斥量接口函数1、创建互斥量函数OSMutexCreate()2、删除互斥量函数 OSMutexDel()3、获取互斥量函数 OSMutexPend()4、释放互斥量函…

互斥量知识

文章目录 互斥量1、基本概念2、互斥量的优先级继承机制3、互斥量应用场景4、互斥量运行机制5、互斥量控制块6、互斥量函数接口&#xff08;1&#xff09;互斥量创建函数 xSemaphoreCreateMutex()&#xff08;2&#xff09;递归互斥量创建函数 xSemaphoreCreateRecursiveMutex()…

同步和互斥

同步和互斥 竞争与协作 在单核 CPU 系统里&#xff0c;为了实现多个程序同时运行的假象&#xff0c;操作系统通常以时间片调度的方式&#xff0c;让每个进程执行每次执行一个时间片&#xff0c;时间片用完了&#xff0c;就切换下一个进程运行&#xff0c;由于这个时间片的时间很…

多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)

文章目录 一、同步与互斥的概念二、互斥锁&#xff08;同步&#xff09;三、条件变量&#xff08;同步&#xff09;1、线程的条件变量实例12、线程的条件变量实例23、虚假唤醒(spurious wakeup) 四、读写锁&#xff08;同步&#xff09;五、自旋锁&#xff08;同步&#xff09;…

同步和互斥区别

互斥的概念 由于多线程执行操作共享变量的这段代码可能会导致竞争状态&#xff0c;因此我们将此段代码称为临界区&#xff08;critical section&#xff09;&#xff0c;它是访问共享资源的代码片段&#xff0c;一定不能给多线程同时执行。 我们希望这段代码是互斥&#xff0…

操作系统——互斥的定义及实现

一、进程互斥的定义 所谓进程互斥,指的是对某个系统资源,一个进程正在使用它,另外一个想用它的进程就必须等待,而不能同时使用 。进程互斥是多道程序系统中进程间存在的一种源于资源共享的制约关系,也称间接制约关系,主要是由被共享资源的使用性质所决定的。 二、互斥…

Fisher判别分析详解

Fisher判别分析 将高维度空间的样本投影到低维空间上&#xff0c;使得投影后的样本数据在新的子空间上有最小的类内距离以及最大的类间距离&#xff0c;使得在该子空间上有最佳的可分离性 可以看出右侧投影后具有更好的可分离性。 Fisher判别分析和PCA差别 刚学完感觉两个很…

基于spss的多元统计分析 之 聚类分析+判别分析(2/8)

实验目的&#xff1a; 1&#xff0e;掌握聚类分析及判别分析的基本原理&#xff1b; 2&#xff0e;熟悉掌握SPSS软件进行聚类分析及判别分析的基本操作&#xff1b; 3&#xff0e;利用实验指导的实例数据&#xff0c;上机熟悉聚类分析及判别分析方法。 实验前预习&#xff1a;…

机器学习——线性判别分析

目录 线性判别分析 LDA的降维过程 案例&#xff1a;鸢尾花(Iris) 代码演示 数据集 局部线性嵌入 线性判别分析 线性判别分析&#xff08;LDA&#xff09;是一种有监督的线性降维算法。与PCA不同&#xff0c;LDA是为了使降维后的数据点尽可能地容易被区分。 线性判别分析…

MATLAB判别分析例题,判别分析的matlab实现案例.doc

判别分析的matlab实现案例.doc 读取EXAMP10_01XLS中数据&#xff0c;进行距离判别读取数据读取文件EXAMP10_01XLS的第1个工作表中C2F51范围的数据&#xff0c;即全部样本数据&#xff0c;包括未判企业SAMPLEXLSREAD EXAMP10_01XLS , , C2F51 读取文件EXAMP10_01XLS的第1个工作…

SAS数据分析之判别分析

判别分析与聚类分析有非常类似的特性&#xff0c;因此&#xff0c;在多数数据分析的教材中&#xff0c;这两章是一前一后出现的&#xff0c;简而言之&#xff0c;聚类分析&#xff0c;其实是判别分析的基础&#xff0c;即在聚类分析的基础上&#xff0c;总结出各类的权值&#…

线性判别分析

线性判别分析&#xff08;LDA&#xff09;是一种经典的线性学习方法。其思想是&#xff1a;给定训练样例集&#xff0c;设法将样例投影到一条直线上&#xff0c;使得同类样例的投影点尽可能接近、异类样例的投影点尽可能远离。如图所示的二分类示意图&#xff1a; 损失函数的…

sas判别分析

#判别分析两大类&#xff1a;Fisher&Bayes #neighbbor&#xff1a;马氏距离和欧氏距离&#xff1b; #典型判别分析&#xff0c;联系典型相关分析#组变量相关&#xff0c;最后得到的每组内变量的线性组合作为典型变量 #协方差矩阵&#xff0c;举个栗子,设一组特征x(a1,a…

【数模】判别分析

文章目录 判别分析简介SPSS操作步骤输出结果分析 判别分析简介 判别分析又称“分辨法”&#xff0c;是在分类确定的条件下&#xff0c;根据某一研究对象的各种特征值判别其类型归属问题的一种多变量统计分析方法。 其基本原理是按照一定的判别准则&#xff0c;建立一个或多个判…

fisher线性判别分析matlab,线性判别分析LDA

首先搞清楚什么叫判别分析&#xff1f;Discriminant Analysis就是根据研究对象的 各种特征值判别其类型归属问题的一种多变量统计分析方法。 根据判别标准不同&#xff0c;可以分为距离判别、Fisher判别、Bayes判别法等。比如在KNN中用的就是距离判别&#xff0c;当然这里的“距…

spssfisher判别分析步骤_spss进行判别分析步骤_spss进行判别分析

1.Discriminant Analysis判别分析主对话框 如图 1-1 所示 图 1-1 Discriminant Analysis 主对话框 (1)选择分类变量及其范围 在主对话框中左面的矩形框中选择表明已知的观测量所属类别的变量(一定是离散变量), 按上面的一个向右的箭头按钮,使该变量名移到右面的Groupin…

R语言判别分析

本文首发于公众号&#xff1a;医学和生信笔记&#xff0c;完美观看体验请至公众号查看本文。 文章目录 Fisher判别分析Bayes判别分析 判别分析&#xff08;discriminant analysis&#xff09;是根据判别对象若干个指标的观测结果判定其属于哪一类的统计方法。经典的判别分析方法…

R 判别分析

判别分析 1. 数据描述2. 调入数据3.Fisher线性判别3.1 计算Fisher线性判别函数3.2 根据线性判别模型对原数据进行预测&#xff0c;并分析预测结果。3.3 对新的数据&#xff08;CF_TD0.31,NI_TA0.06, CA_CL4.23, CA_NS0.62&#xff09;进行判定。 4.距离判别&#xff08;协方差矩…

16种常用的数据分析方法-判别分析

判别分析又称为线性判别分析&#xff08;Linear Discriminant Analysis&#xff09;。产生于20世纪30年代&#xff0c;是利用已知类别的样本建立判别模型&#xff0c;为未知类别的样本判别的一种统计方法。 ​ 判别分析方法目的与特点 目的 判别分析的目的是对已知分类的数据建…

SPSS(十六)SPSS之判别分析(图文+数据集)

SPSS&#xff08;十六&#xff09;SPSS之判别分析&#xff08;图文数据集&#xff09; 判别分析又称“分辨法”&#xff0c;是在分类确定的条件下&#xff0c;根据某一研究对象的各种特征值判别其类型归属问题的一种多变量统计分析方法。 聚类分析与判别分析的区别与联系 都是…