二值信号量和互斥信号量的区别

2023-05-16

互斥信号量和二进制信号量的区别

      

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

 

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

 

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

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

 

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

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

 

理解互斥量和信号量 作者: JuKevin

互斥量(Mutex)

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

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

       只允许信号量取01值,其同时只能被一个线程获取。

 

整型信号量(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. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二值信号量和互斥信号量的区别 的相关文章

  • 使用StreamTorrent观看流媒体电视

    Looking for a way to watch premium sports and entertainment television on your PC Today we look at StreamTorrent which i
  • Python“ while”循环(无限迭代)

    Iteration means executing the same block of code over and over potentially many times A programming structure that imple
  • kubernetes_Kubernetes手册

    kubernetes Kubernetes is an open source container orchestration platform that automates the deployment management scalin
  • 设置成功的开源计划办公室(OSPO)的指南

    公司创建了开放源代码计划办公室 xff08 OSPO xff09 xff0c 以管理其与所依赖的开放源代码生态系统的关系 通过了解公司的开源生态系统 xff0c OSPO可以最大化公司的投资回报率 xff0c 并降低使用 xff0c 贡献和
  • 开源搜索引擎 种子搜索_使用开源搜索引擎自定义您的互联网

    开源搜索引擎 种子搜索 很久以前 xff0c 互联网很小 xff0c 只有几个人可以将它们编入索引 xff0c 这些人收集了所有网站的名称和位置 xff0c 并按页面或印刷书籍中的主题列出了它们 随着万维网网络的发展 xff0c 网络响动
  • 开源 apm_使用开源APM软件:InspectIT

    开源 apm 在当今时代 xff0c 软件系统不断变得越来越复杂 同时 xff0c 客户对响应时间和可用性的期望比以往更高 如您所知 xff0c 性能不佳的服务可能会将客户吸引到竞争对手的产品中 因此 xff0c 系统故障和性能不佳通常会对
  • 啦啦啦啦啦_开放组织读书俱乐部:啦啦队长如何设定方向

    啦啦啦啦啦 我们终于进入了为期7周的开放式组织虚拟图书俱乐部的第7章 xff0c 催化方向 在前几周 xff0c 我们讨论了开放组织的原因和方式 与启动上周的包容性决策的讨论 xff0c 我们一头扎进了 自下而上 的组织模式是什么成分 现在
  • cisco路由器vty_如何使用VTY Shell配置路由器

    cisco路由器vty 最近 xff0c 我写了一篇文章 xff0c 解释了如何使用Quagga路由套件实现开放式最短路径优先 xff08 OSPF xff09 可以使用多个软件套件代替Quagga来实现不同的路由协议 一种这样的选择是自由
  • powerdns_使用PowerDNS为名称服务器轻松配置DNS

    powerdns 几个月前 xff0c 我们要求为新项目提供稳定可靠的域名系统 xff08 DNS xff09 服务器 该项目使用容器进行自动部署 xff0c 每个新环境将在其中生成唯一的随机URL 在对可能的解决方案进行了大量研究之后 x
  • 人工智能革命(下):永生还是毁灭

    导读 xff1a 本系列文章讲述了人工智能革命的爆发以及人类未来的出路 xff0c 由于篇幅较长分为上下两篇 xff0c 原英文载于神奇的网站 WaitButWhy com xff0c 作者Tim Urban还写过一篇有关脑机接口的文章 N
  • rust vs java_为什么我喜欢以Java程序员的身份学习Rust

    rust vs java 自从我正确地学习了计算机或人类这门新语言以来 xff0c 已经很长时间了 也许25年 那是Java语言 xff0c 尽管与此同时我不得不写一点点C xff08 很少 xff09 和JavaScript xff0c
  • git-cola使用教程_使用Git Cola轻松实现Git

    git cola使用教程 Git是一个Linux命令 xff0c 可帮助您管理工作的版本 它已被移植到BSD xff0c macOS xff0c Windows等 它是流行的代码托管服务的基础 xff0c 包括GitLab和NotABug等
  • .net 开发使用什么语言_如何开始使用.NET开发

    net 开发使用什么语言 NET框架由Microsoft在2000年发布 该平台的开源实现Mono在2000年代初一直是争议的中心 xff0c 因为Microsoft拥有 NET技术的多项专利 xff0c 并且可以使用这些专利终止Mono的
  • linux重启命令_3条命令重启Linux(另外4种安全方式)

    linux重启命令 Linux完全有能力运行 xff0c 而不需要数周 xff0c 而是数年 xff0c 而无需重新启动 在某些行业中 xff0c 这正是Linux的功能 xff0c 这要归功于kpatch和kgraph之类的进步 但是 x
  • crazy pony_Pony编程语言简介

    crazy pony 在Wallaroo Labs xff08 我是工程副总裁 xff09 xff0c 我们正在构建以Pony编程语言编写的高性能 xff0c 分布式流处理器 大多数人都没有听说过Pony xff0c 但是对于Wallaro
  • html标记语言图像标记_为什么我喜欢这些标记语言

    html标记语言图像标记 去年大约这个时候 xff0c 我为本专栏文章简要介绍了各种标记语言 语言选择的话题最近出现了好几次 xff0c 所以我认为现在该是时候以我的偏见来重新讨论这个话题了 我在这里解释为什么我更喜欢我的语言 xff0c
  • 无人机开源项目_8个开源无人机项目

    无人机开源项目 编者注 xff1a 本文最初发表于2016年12月 xff0c 现已更新以包含其他信息 在过去的几年中 xff0c 对民用 xff0c 军事和商用无人机的兴趣Swift增长 xff0c 这也带动了制造商社区对开源无人机项目的
  • 开源协议 自主发展_开源推动科学发展的9个故事

    开源协议 自主发展 如今 xff0c 科学可能看起来更像开源 世界各地的研究人员和科学家都在呼吁获得免费许可的数据集 开放获取发布条件 xff1b 以及协作 xff0c 透明的同行评审 他们正在寻找开放源代码原则可以增强数字时代知识生产实践
  • 开源 word 替代_5种Google文档的开源替代品

    开源 word 替代 每天处理大量文档时 xff0c 无论您写什么 xff08 白皮书 xff0c 手册 xff0c 演示文稿 xff0c 不同的市场营销材料 xff0c 合同等 xff09 xff0c 都必须在某个时候 xff08 最常见

随机推荐

  • vscode快捷键 & java/c++环境

    vscode快捷键 amp java c 43 43 环境 vscode快捷键环境配置javac 43 43 个人习惯设置参考 vscode快捷键 快捷键功能Ctrl 43 Shift 43 P 或 F1显示所有命令Ctrl 43 空格触发
  • IIC通信协议(简单易理解版)

    IIC通信协议简介 xff1a IIC xff08 也记为I2C xff0c 读作I 2C xff0c inter integrated Circuit集成电路总线 xff0c 最早是飞利浦在1982年开发设计并用于自己的芯片上 xff0c
  • linux防病毒软件_十大Linux最佳防病毒软件-Linux防病毒软件列表!

    linux防病毒软件 Today s article is all about the best Antivirus for Linux But if Linux is so secure why do we need to have an
  • Python isinstance()

    Python isinstance function is used to check if an object is an instance of the specified class or not Python的isinstance
  • 使用git下载仓库_使用Git仓库

    使用git下载仓库 Whenever we start a project we will need to store all files in a repository So let 39 s start by first creatin
  • 在Raspberry Pi(ARM32)上的Docker中构建,运行和测试.NET Core和ASP.NET Core 2.1

    I love me some Raspberry Pi They are great little learning machines and are super fun for kids to play with Even if thos
  • 什么是Ubuntu LTS?与常规Ubuntu版本有何不同?

    Ubuntu distributions are released at given time intervals Every release has a code name that is related to an animal nam
  • 定义一个protobuf消息并生成Go代码

    大家好 xff01 让我们开始gRPC课程的动手部分 整个部分的目标是构建 个人计算机 Web服务 xff0c 该服务将使我们能够管理和搜索笔记本电脑配置 Here 39 s the link to the full gRPC course
  • 学科起源(漫画版)

    发几张收藏的图 xff0c 让大家对学科起源有点了解 xff0c 避免因学科纷争而引起不和 xff0c 生命科学也罢 xff0c 神经网络也罢都摆脱不了从物理和数学的角度去解释 xff0c 因为机器学习中很大的一部分 xff0c 尤其是神经
  • 【沧海拾昧】WiFi串口通信ESP8266模块基本介绍(附野火WiFi透传实例)

    C0104 沧海茫茫千钟粟 xff0c 且拾吾昧一微尘 沧海拾昧集 64 CuPhoenix 阅前敬告 沧海拾昧集仅做个人学习笔记之用 xff0c 所述内容不专业不严谨不成体系 如有问题必是本集记录有谬 xff0c 切勿深究 目录 前言一
  • linux shell

    转自 xff1a http blog csdn net fly sky520 article details 8853537 最近在linux下面编写shell脚本 xff0c 差不多是边学边写 在此记录一些学习心得 一 xff09 she
  • 软件开发遇到的难题_软件开发团队如何处理管理难题

    软件开发遇到的难题 通常是这样的 项目经理或产品负责人传达了来自公司食品链上层人士的消息 xff0c 即必须在给定日期之前交付软件 日期背后的原因可能是已知的 xff0c 但可能不是 反过来 xff0c 项目经理通知软件开发团队必须在该日期
  • Ubuntu20.04由于分辨率问题安装界面显示不完整

    使用vmware安装ubuntu的时候 xff0c 由于分辨率的问题 xff0c 导致安装界面显示不完整 xff0c button被隐藏 xff0c 无法进行下一步鼠标操作 同学遇到的问题 xff0c 迟迟不能解决 xff0c 参考别人的解
  • 数据结构排序算法及代码整理

    排序 xff1b 1 插入排序 xff08 直接插入排序和希尔排序 xff09 2 选择排序 xff08 直接选择排序和堆排序 xff09 3 交换排序 xff08 冒泡排序和快速排序 xff09 4 归并排序 5 基数排序 xff0d x
  • 排序算法性能比较

    各种排序方法的综合比较 结论 排序方法 平均时间 最坏时间 辅助存储 简单排序 O n2 O n2 O 1 快速排序 O nlogn O n2 O logn 堆排序 O nlogn O nlogn O 1 归并排序 O nlogn O nl
  • c++标准容器类(表格介绍)

    1 STL有6种序列容器类型 xff08 1 xff09 vector 它提供对元素的随即访问 xff0c 在尾部添加和删除元素的时间是固定的 xff0c 在头部或中部插入和删除元素的复杂度为线性时间 xff08 2 xff09 deque
  • 各大公司薪水一览表

    转自 http blog sina com cn s blog 4997a23a0100b2xc html 最近终于把自己给卖了 xff0c 这几个月来自己陆陆续续的面试的有30多家公司 xff0c 主要是IT公司 xff0c 准备把今年我
  • strtol

    转自 xff1a http hi baidu com qwpsmile blog item 9bc44efa4f41018a9f514637 html 今天 xff0c 在review 一些代码的时候 xff0c 看到了strtol 这个函
  • 学会做自己的朋友

    转自 http www 5xue com modules article view article php a2233 你是否经历过 xff1a 我们常会怪罪自己 xff0c 给自己很低的评价 xff0c 也习惯对结果做最坏的打算 xff1
  • 二值信号量和互斥信号量的区别

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