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

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

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

打印机资源只有一个,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. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

互斥信号量和二进制信号量相关推荐

  1. FreeRTOS笔记篇:第七章 -- 资源管理(互斥锁、二进制信号量、死锁)

    测试环境如下 stm32F103C8T6 MDK keil5 stm32cube + FreeRTOS 概述 在多任务处理系统中,如果一个任务开始访问资源,但在脱离运行状态之前没有完成其访问,则有可能 ...

  2. 二进制信号量,互斥信号和计数信号量的区别

    VxWorks的信号量机制分析 VxWorks信号量是提供任务间通信.同步和互斥的最优选择,提供任务间最快速的通信.也是提供任务间同步和互斥的主要手段.VxWorks提供3种信号量来解决不同的问题. ...

  3. freertos 创建互斥量_FreeRTOS的信号量和互斥量

    1. 理解如下,言简意赅的说,信号量解决同步,互斥量解决竞争. 信号量用于同步,主要任务间和中断间同步:互斥量用于互锁,用于保护同时只能有一个任务访问的资源,为资源上一把锁. 互斥量具有优先级继承,信 ...

  4. FreeRTOS笔记篇:第六章 - (二进制信号量 计数信号量 队列下)使用中断管理

    目录 测试环境如下 概述 概况 中断对RTOS的影响 中断请求任务切换的宏 延迟中断处理 二进制信号量 xSemaphoreCreateBinary() xSemaphoreTake() xSemap ...

  5. 第4章第7节nbsp;二进制信号量(一)

    目前更新到5.3节,请在http://dl.dbank.com/c02ackpwp6下载5.3节的全部文档 本节源代码请在http://dl.dbank.com/c0fp2g5z9s下载 第7节 二进 ...

  6. 第4章第7节nbsp;二进制信号量(二)

    目前更新到5.3节,请在http://dl.dbank.com/c02ackpwp6下载5.3节的全部文档 本节源代码请在http://dl.dbank.com/c0fp2g5z9s下载 释放信号量的 ...

  7. 判断sem信号量为零_Linux系统编程——进程同步与互斥:System V 信号量

    信号量概述 信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问. 编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 ...

  8. 【Linux系统编程】进程同步与互斥:System V 信号量

    信号量概述 信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问. 编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 ...

  9. 【Linux系统编程】进程同步与互斥:POSIX有名信号量

    在 POSIX 标准中,信号量分两种,一种是无名信号量,一种是有名信号量.无名信号量一般用于线程间同步或互斥,而有名信号量一般用于进程间同步或互斥.它们的区别和管道及命名管道的区别类似,无名信号量则直 ...

最新文章

  1. javascript基础 之 json
  2. 移动端事件 、zepto移动端事件
  3. 宏碁电脑开启虚拟化技术_开启windows电脑的cpu虚拟化(VT)图文操作步骤
  4. AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking...
  5. Visual Studio 2017 RC3支持.NET Core,延迟对Python的支持
  6. c++远征之继承篇——隐藏,isa,虚析构函数
  7. c语言学习-求一元二次方程的根
  8. lnmp的php.ini,lamp/lnmp优化3--phpini
  9. C++ 常量类型 const 详解
  10. android开发学习笔记系列(6)--代码规范
  11. 考研和找工作都可以用的简历模板百度网盘链接
  12. 如何从电脑直接控制安卓手机 监控安卓手机 安卓手机如何控制安卓手机
  13. 父母尚在苟且,你却在炫耀诗和远方
  14. 夜雨数竞笔记-中值问题(5)-泰勒中值定理
  15. win10更改了用户名后远程登录还要用原来的用户名怎么修改
  16. MySQL Failover搭建
  17. php中array_unshift,php中array_unshift()修改数组key注意事项分析
  18. 共享经济思考:标准化与个性化如何融合
  19. kingsoft的服务器信息,Win10系统kingsoft是什么文件夹?可以删除吗?
  20. RHCE认证考试教材

热门文章

  1. 如何快速的解决Maven依赖冲突
  2. html5语异性元素,异性的5句性暗示
  3. machine id linux,linux – 机器ID是uuid吗?
  4. (JAVA)IO缓冲区
  5. oracle19c xp安装 客户端_windows下安装oracle19c
  6. 昆山立讯电子工程师_教会徒弟饿死师傅?立讯精密会不会成为第二个富士康
  7. hadoop join之map side join
  8. Ubuntu下用apache+perl搭建最简单的聊天室
  9. 581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
  10. iptables禁止端口和开放端口