互斥信号量和二进制信号量

互斥信号量和二进制信号量的区别
      
互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效。同一个任务可以递归申请。

       二进制信号量,一个任务申请成功后,可以由另一个任务释放。

二进制信号量实现任务互斥:

     打印机资源只有一个,abc三个任务共享,当a取得使用权后,为了防止其他任务错误地释放了信号量(),必须将打印机房的门关起来(进入临界段),用完后,释放信号量,再把门打开(出临界段),其他任务再进去打印。(而互斥型信号量由于必须由取得信号量的那个任务释放,故不会出现其他任务错误地释放了信号量的情况出现,故不需要有临界段。互斥型信号量是二进制信号量的子集。)

二进制信号量实现任务同步:

     a任务一直等待信号量,b任务定时释放信号量,完成同步功能


理解互斥量和信号量 作者: JuKevin
互斥量(Mutex) 
       互斥量表现互斥现象的数据结构,也被当作二元信号灯。一个互斥基本上是一个多任务敏感的二元信号,它能用作同步多任务的行为,它常用作保护从中断来的临界段代码并且在共享同步使用的资源。

       Mutex本质上说就是一把锁,提供对资源的独占访问,所以Mutex主要的作用是用于互斥。Mutex对象的值,只有0和1两个值。这两个值也分别代表了Mutex的两种状态。值为0, 表示锁定状态,当前对象被锁定,用户进程/线程如果试图Lock临界资源,则进入排队等待;值为1,表示空闲状态,当前对象为空闲,用户进程/线程可以Lock临界资源,之后Mutex值减1变为0。Mutex可以被抽象为四个操作: - 创建 Create

- 加锁 Lock

- 解锁 Unlock

- 销毁 Destroy

Mutex被创建时可以有初始值,表示Mutex被创建后,是锁定状态还是空闲状态。在同一个线程中,为了防止死锁,系统不允许连续两次对Mutex加锁(系统一般会在第二次调用立刻返回)。也就是说,加锁和解锁这两个对应的操作,需要在同一个线程中完成。

 

不同操作系统中提供的Mutex函数: 动作/系统

Win32

Linyx

Solaris

 

创建

CreateMutex

pthread_mutex_init

mutex_init

 

加锁

WaitForSingleObject

pthread_mutex_lock

mutex_lock

 

解锁

ReleaseMutex

pthread_mutex_unlock

mutex_unlock

 

销毁

CloseHandle

pthread_mutex_destroy

mutex_destroy

 

 

信号量

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。

 

信号量可以分为几类:

 

二进制信号量(binary semaphore):
       只允许信号量取0或1值,其同时只能被一个线程获取。

 

整型信号量(integer semaphore)
       信号量取值是整数,它可以被多个线程同时获得,直到信号量的值变为0。

 

记录型信号量(record semaphore)
       每个信号量s除一个整数值value(计数)外,还有一个等待队列List,其中是阻塞在该信号量的各个线程的标识。当信号量被释放一个,值被加一后,系统自动从等待队列中唤醒一个等待中的线程,让其获得信号量,同时信号量再减一。

 

       信号量通过一个计数器控制对共享资源的访问,信号量的值是一个非负整数,所有通过它的线程都会将该整数减一。如果计数器大于0,则访问被允许,计数器减1;如果为0,则访问被禁止,所有试图通过它的线程都将处于等待状态。

计数器计算的结果是允许访问共享资源的通行证。因此,为了访问共享资源,线程必须从信号量得到通行证, 如果该信号量的计数大于0,则此线程获得一个通行证,这将导致信号量的计数递减,否则,此线程将阻塞直到获得一个通行证为止。当此线程不再需要访问共享资源时,它释放该通行证,这导致信号量的计数递增,如果另一个线程等待通行证,则那个线程将在那时获得通行证。

 

 

Semaphore可以被抽象为五个操作:

- 创建 Create

 

- 等待 Wait:

 

线程等待信号量,如果值大于0,则获得,值减一;如果只等于0,则一直线程进入睡眠状态,知道信号量值大于0或者超时。

 

-释放 Post

 

执行释放信号量,则值加一;如果此时有正在等待的线程,则唤醒该线程。

 

-试图等待 TryWait

 

如果调用TryWait,线程并不真正的去获得信号量,还是检查信号量是否能够被获得,如果信号量值大于0,则TryWait返回成功;否则返回失败。

 

-销毁 Destroy

 

信号量,是可以用来保护两个或多个关键代码段,这些关键代码段不能并发调用。在进入一个关键代码段之前,线程必须获取一个信号量。如果关键代码段中没有任何线程,那么线程会立即进入该框图中的那个部分。一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。 动作/系统

Win32

POSIX

 

创建

CreateSemaphore

sem_init

 

等待

WaitForSingleObject

sem _wait

 

释放

ReleaseMutex

sem _post

 

试图等待

WaitForSingleObject

sem _trywait

 

销毁

CloseHandle

sem_destroy

 

 

 

互斥量和信号量的区别

1. 互斥量用于线程的互斥,信号量用于线程的同步。 ——

       这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。

2.互斥量无法保证线程对资源的有序访问,信号量可以。

 

互斥
       是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。(cute:好比一个别墅,同时只能卖个一个人。这个人可以在门上加上任意多的锁(申请多次),但是锁必须由这个人打开,因为只有他掌握着钥匙。如果别的人真的想控制这个别墅的大门,则它首先应该把这个别墅买下来(别墅的主人放弃所有权))

 

同步
       是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源 (cute:相当于图书馆阅览室的书卡,你申请的时候-1,另一个人还的时候则可以+1,我们都可以修改书卡的当前可用数目,这个权利是不独属于任何人的。)

 

3. 互斥量值只能为0/1,信号量值可以为非负整数。

 

       也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。

 

4. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

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

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

相关文章

【转】c#数字图像处理(三)灰度直方图

转自:https://www.cnblogs.com/dearzhoubi/p/8621804.html 灰度直方图是灰度的函数,描述的是图像中具有该灰度级的像素的个数。如果用直角坐标系来表示,则它的横坐标是灰度级,纵坐标是该灰度出现的概率(像素的个数)。 using System; using System.Collections.Gener…

电梯门禁系统服务器一般在哪,别被吓住了,电梯门禁(梯控)安装其实并不难...

电梯门禁又称梯控,主要用于对电梯的出入权限进入控制,只有授权卡在读卡器刷过后,才能到达指定楼层。梯控的使用越来越普遍了,很多人觉得梯控很神秘,很高不可攀,其实说到底它不过是门禁的一种,只…

调用Microsoft.Jet.OLEDB.4.0需要MDAC2.7支持

asp.net进行Excel导入时需要调用Microsoft.Jet.OLEDB.4.0 strConn "ProviderMicrosoft.Jet.OLEDB.4.0;Data Source" AimFile ";Extended PropertiesExcel 8.0;"; 需要MDAC (Microsoft Data Access Components) 2.7 或更高版本才能支持. 转载于:https://…

获得系统中某个进程的cpu使用率

列举所有进程的CPU占用率) typedef struct _THREAD_INFO { LARGE_INTEGER CreateTime; DWORD dwUnknown1; DWORD dwStartAddress; DWORD StartEIP; DWORD dwOwnerPID; DWORD dwThreadId; DWORD dwC…

【转】c#数字图像处理(四)线性点运算

转自:https://www.cnblogs.com/dearzhoubi/p/8622325.html 灰度图像的点运算可分为线性点运算和非线性点运算两种。 4.1线性点运算定义 线性点运算就是输出灰度级与输入灰度级呈线性关系的点运算。在这种情况下,灰度变换函数的形式为: g(x, y)pf(x,y)L 其中 f(x,…

工作人员做好项目协调服务器,项目团队协作做好三件事

原标题: 项目团队协作做好三件事大家也许在小时候就听过三个和尚的故事:当庙里有一个和尚时,他一切自己做主,做得很自在;当庙里有两个和尚时,他们通过协商可以自觉地进行分工合作,同样做的不错;可当庙里来了…

给vc6插上翅膀

最重要的当然是VC助手了。。我比较喜欢低版本的Visual.Assist.v6.0.0.1079.zip,环保类型的 但无奈我的vs2005也想使用这个插件,所以我选择了VisualAssistXv10,目前装的是Visual.Assist.X.10.4.1626.0 以前还用过一些版本很奇怪的,…

vxworks 调式

1,boot操作相关 串口命令行重启回车进入boot: 查看boot版本:v 更新: c 升级设备: w 运行: g 2, 代码: 2.1添加命令行: DEFUN, install_element 2.2 VxWorks使用 i:查看任务; memShow:查看内存情况; tt&#…

【转】[程序集清单定义与程序集引用不匹配]分析及解决

转自:https://www.cnblogs.com/shuangzimuchangzhu/p/8572817.html 什么是程序集清单(Assembly Manifest)? 我们知道,在.net中。程序是以程序集为单位进行打包的,通常一个.exe文件或一个.dll文件就是一个程序集。程序集一般包含了以下几个部…

dos如何修改远程服务器的密码,dos命令登入远程服务器

dos命令登入远程服务器 内容精选换一换远程桌面链接Windows云服务器报错:连接被拒绝,因为没有授权此用户账户进行远程登录。Windows远程桌面相关权限配置异常。在运行窗口输入secpol.msc,打开组策略编辑器打开"本地策略 > 用户权限分…

第二届(2009年)中国信息技术应用学术研讨会征文延期通知

第二届(2009年)中国信息技术应用学术研讨会征文延期通知 中国信息技术应用学术研讨会征文活动自开展以来,因其征文范围广、贴近科技需求,EI及ISTP检索率高(第一届英文稿件达到100%),且正式出版论…

设计模式C++实现 ——状态模式

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书&#xff0…

Apache在windows的设置

本节主要考虑windows的安装和配置使用,Linux 参考:http://httpd.apache.org/docs/2.2/stopping.html 一 Apache在windows的安装主要支持windows NT 86系统,安装文件或源代码下载页:http://httpd.apache.org/download.cgi。安装过程…

【转】正确认识动脉压力波形

转自:https://www.sohu.com/a/288192545_377325 前言 早在50多年前,就已经在麻醉患者中开始进行直接动脉血压监测。尽管对动脉压力波形的形态和细节进行分析可以给我们提供一些有用的诊断信息,但现代的医生似乎很少关注它。临床实践中的这些…

2008服务器ftp上传文件,win2008怎么开通服务器ftp上传

win2008怎么开通服务器ftp上传 内容精选换一换GPU加速型实例如需使用OpenGL/DirectX/Vulcan等图形加速能力则需要安装GRID驱动并自行购买和配置使用GRID License。此外,GRID驱动配合vDWS类型License,也支持CUDA,用来满足既需要计算加速也需要…

【转】温故之.NET 异步

转自:https://zhuanlan.zhihu.com/p/38537169 这篇文章包含以下内容 异步基础基于任务的异步模式部分 API 介绍 异步基础 所谓异步,对于计算密集型的任务,就是以线程为基础的多任务。而在具体使用中,使用线程池里面的线程还是新…

C库函数—strcpy实现

strcpy&#xff1a;将原串拷贝到目的串&#xff0c;不拷贝NULL 以下为具体实现&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> char * strcpy(char * strDest, const char * strSrc){ if(NULL strSrc || NULL strDest){ …

从数据库读写RadioButtonList选中的值

从数据库取出RadioButtonList选中的值 string str "体育";//这一项可以从数据库中读出 for (int j 0; j < this.RadioButtonList1.Items.Count; j) { if (str this.RadioButtonList1.Items[j].Text.ToString()) { this.RadioButtonList1.Items[j].Selected…

【转】DICOM中几个判断图像方向的tag

转自&#xff1a;https://www.cnblogs.com/h2zZhou/p/9072967.html 在DICOM标准里&#xff0c;有三个TAG与成像的方向相关。 参考来源&#xff1a;Kitware关于DICOM方向的说明 http://public.kitware.com/IGSTKWIKI/index.php/DICOM_data_orientation 包括 1、Image Positi…

贪心算法的几个应用

贪心算法具有2个性质&#xff1a; 1、贪心选择性质&#xff1a;只在当前状态下做最优选择&#xff0c;即局部最优选择&#xff0c;再自顶向下&#xff0c;去解做出这个选择后产生的相应子问题。每做一次选择&#xff0c;问题就转化为规模更小的子问题。对于一个具体问题&#x…