互斥锁、条件变量、信号量浅析

互斥锁、条件变量、信号量浅析

互斥锁与条件变量

  1. 条件变量是为了保证同步 条件变量用在多线程多任务同步的,一个线程完成了某一个动作就通过条件变量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里)。信号量可以看作是有计数的条件变量。
  2. 互斥锁是为了保证互斥 互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,再解锁。互斥锁可以看作是二值信号量。
  3. 有的时候互斥锁和条件变量会同时使用的 条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足。在发送信号时,如果没有线程等待在该条件变量上,那么信号将丢失。

信号量

简介

信号量可以看作是互斥锁和条件变量的结合,而互斥锁和条件变量则可以看作是信号量的一种特殊形式

信号量:只要信号量的value大于0,其他线程就可以sem_wait成功,成功后信号量的value减一。若value值不大于0,则sem_wait阻塞,直到sem_post释放后value值加1。

以下是信号灯(量)的一些概念:

  1. 信号灯与互斥锁和条件变量的主要不同在于”灯”的概念,灯亮则意味着资源可用,灯灭则意味着不可用。如果说后两中同步方式侧重于**”等待”操作,即资源不可用的话,信号灯机制则侧重于"点灯"**,即告知资源可用;
  2. 没有等待线程的解锁或激发条件都是没有意义的,而没有等待灯亮的线程的点灯操作则有效,且能保持灯亮状态。
  3. 信号灯的应用除了灯亮/灯灭这种二元灯以外,也可以采用大于1的灯数,以表示资源数大于1,这时可以称之为多元灯。

信号灯(量)API

创建和注销

POSIX信号灯标准定义了有名信号灯和无名信号灯两种,但LinuxThreads的实现仅有无名灯,同时有名灯除了总是可用于多进程之间以外,在使用上与无名灯并没有很大的区别,因此下面仅就无名灯进行讨论。

  1. 创建

    int sem_init(sem_t *sem, int pshared, unsigned int value)

    这是创建信号灯的API,其中value为信号灯的初值,pshared表示是否为多进程共享而不仅仅是用于一个进程。LinuxThreads没有实现多进程共享信号灯,因此所有非0值的pshared输入都将使sem_init()返回-1,且置errnoENOSYS。初始化好的信号灯由sem变量表征,用于以下点灯、灭灯操作。

  2. int sem_destroy(sem_t * sem)

    被注销的信号灯sem要求已没有线程在等待该信号灯,否则返回-1,且置errnoEBUSY。除此之外,LinuxThreads的信号灯注销函数不做其他动作。

点灯和灭灯

  1. 点灯

    int sem_post(sem_t * sem)

    点灯操作将信号灯值原子地加1,表示增加一个可访问的资源,sem_post()是唯一能用于异步信号处理函数的POSIX异步信号安全的API。

  2. 灭灯

    int sem_wait(sem_t * sem)
    int sem_trywait(sem_t * sem)

    sem_wait()为等待灯亮操作,等待灯亮(信号灯值大于0),然后将信号灯原子地减1,并返回。sem_trywait()sem_wait()的非阻塞版,如果信号灯计数大于0,则原子地减1并返回0,否则立即返回-1,errno置为EAGAIN

获取灯值

int sem_getvalue(sem_t * sem, int * sval)

读取sem中的灯计数,存于*sval中,并返回0。

辨析拾遗

  1. 互斥锁必须是谁上锁就由谁来解锁,而信号量的wait和post操作不必由同一个线程执行。
  2. 互斥锁是为上锁而优化的;条件变量是为等待而优化的; 信号量既可用于上锁,也可用于等待,因此会有更多的开销和更高的复杂性。
  3. 互斥锁,条件变量都只用于同一个进程的各线程间,而信号量(有名信号量)可用于不同进程间的同步。当信号量用于进程间同步时,要求信号量建立在共享内存区。
  4. 信号量有计数值,每次信号量post操作都会被记录,而条件变量在发送信号时,如果没有线程在等待该条件变量,那么信号将丢失。

Ref:

http://blog.chinaunix.net/uid-20671208-id-4935154.html

http://blog.chinaunix.net/uid-23061624-id-79936.html

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

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

相关文章

xpwifi热点设置android,教你在XP电脑中开启设置WiFi热点使用的步骤

对于系统中网络的连接问题是最重要的,那在处理不同的错误的情况中,对于无线网络的设置也就是我们说的WiFi的使用也是会遇到问题的,那在操作的时候对于电脑中是怎么实现设置WiFi热点的的,对于这个问题今天小编就来跟大家分享一下教…

C/C++ 指针详解

指针详解 参考视频:https://www.bilibili.com/video/BV1bo4y1Z7xf/,感谢Bilibilifengmuzi2003的搬运翻译及后续勘误,也感谢已故原作者Harsha Suryanarayana的讲解,RIP。 学习完之后,回看找特定的知识点,善…

android双联动列表,Android Fragment实现列表和内容联动

在平板上经常能看到这种的情况:左边是一个列表,右边是列表项对应的内容,当点击某一个列表时,右边内容区也会随之改变。下面使用fragment简单的demo:思路:在mainactivity定义一个回调接口,并在列…

linux /proc 详解

linux /proc 详解 本文整理了一下 linux /proc下的几个常用的目录和文件,可供查阅,之后在学习工作中有别的用到的话会再补充。 /proc 简介 Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是&#xff0…

android模拟器太卡,安卓模拟器安装之后太卡怎么解决

用安卓模拟器玩游戏原理就是在电脑上安装了一部手机,如果你的电脑配置不是非常高,能不卡顿吗?遇到卡顿怎么解决?1、安装最新版本的显卡驱动。逍遥模拟器对于显卡的性能要求很高,因此升级至最新版本的显卡驱动,是确保逍遥模拟器流…

编程环境中Runtime(运行时)的三个含义

编程环境中Runtime(运行时)的三个含义 转自:https://www.zhihu.com/question/20607178 知乎答主doodlewind 三个含义 实际上编程语境中的 runtime 至少有三个含义,分别是: 指「程序运行的时候」,即程序…

非常不错的一款html5【404页面】,不含js脚本可以左右摆动,原生JavaScript实现日历功能代码实例(无引用Jq)...

这篇文章主要介绍了原生JavaScript实现日历功能代码实例(无引用Jq),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下成品显示,可左右切换月份html 代码移动端日历日一二三四五六css代码*{margin: 0;pa…

12 [虚拟化] 进程抽象;fork,execve,exit

12 [虚拟化] 进程抽象;fork,execve,exit 南京大学操作系统课蒋炎岩老师网络课程笔记。 视频:https://www.bilibili.com/video/BV1N741177F5?p12 讲义:http://jyywiki.cn/OS/2021/slides/8.slides#/ 本讲概述 回到“…

计算机应用与基础实践怎么考,自考计算机基础应用科目笔试和实践性考试怎么考...

自考计算机基础应用科目笔试和实践性考试怎么考? 报考自考的考生有些专业的考生会在自己的课程科目中发现计算机基础应用不仅有理论知识考试还有实践性考试,那么自考计算机基础应用科目的笔试和实践性考试怎么考?自考计算机基础应用科目笔试怎…

14 [虚拟化] 虚存抽象;Linux进程的地址空间

14 [虚拟化] 虚存抽象;Linux进程的地址空间 南京大学操作系统课蒋炎岩老师网络课程笔记。 视频:https://www.bilibili.com/video/BV1N741177F5?p14 讲义:http://jyywiki.cn/OS/2021/slides/10.slides#/ 本讲概述 程序 状态机;…

浏览器是指在用户计算机上,自考《网页设计与制作》测试题及答案

自考《网页设计与制作》测试题及答案学习是一个不断积累的过程,为帮助考生们更好地复习《与制作》科目知识点,以下是搜索整理的一份自考《网页设计与制作》测试题及答案,供参考练习,希望对大家有所帮助!想了解更多相关信息请持续关…

Ubuntu 18.04 安装OpenCV C++

Ubuntu 18.04 安装OpenCV C 构建并安装 仅构建核心模块 # 更新并安装依赖 # 更新并安装依赖 sudo apt update && sudo apt install -y cmake g wget unzip# 下载并解压包 wget -O opencv.zip https://github.com/opencv/opencv/archive/master.zip unzip opencv.zip…

html计算x的y,HTML5画布:旋转时计算x,y点

我开发了一个HTML5 Canvas应用程序,它涉及到读取一个xml文件,该文件描述了需要在画布上绘制的箭头,直形和其他形状的位置。的XML布局的HTML5画布:旋转时计算x,y点实施例:如果对象被旋转它涉及计算一个点的位…

(2021) 20 [虚拟化] 进程调度

(2021) 20 [虚拟化] 进程调度 南京大学操作系统课蒋炎岩老师网络课程笔记。 视频:https://www.bilibili.com/video/BV1HN41197Ko?p20 讲义:http://jyywiki.cn/OS/2021/slides/11.slides#/ 背景 — 机制与策略分离 机制:一个通用的、可定制…

计算机组装过程英文版,计算机组装与维护试题及答案(国外英文资料).doc

计算机组装与维护试题及答案(国外英文资料)计算机组装与维护试题及答案(国外英文资料)(1) choiceIn the following equipment, the input device is (b)A. b. b. c. c. c. d. d.In Windows 98, the combination of CTRL Alt Del is (c)A. cold start b. heat start c. interr…

make命令及makefile

make命令及makefile 转自:https://www.ruanyifeng.com/blog/2015/02/make.html Make 命令教程 作者: 阮一峰 日期: 2015年2月20日 代码变成可执行文件,叫做编译(compile);先编译这个&#…

局域网中计算机网络密码查看,Win10怎么查看电脑上已知的wifi网络密码

方法一:网络和共享中心查询1、在Windows 10桌面最左下角的【Windwos开始图标上右键】,在弹出的菜单中点击打开【网络连接】,如下图所示。2、在打开的网络连接设置中,双击已经连接的【无线网络名称】,在弹出的【WLAN状态…

(2021) 22 [持久化] 1-Bit的存储

(2021) 22 [持久化] 1-Bit的存储 南京大学操作系统课蒋炎岩老师网络课程笔记。 视频:https://www.bilibili.com/video/BV1HN41197Ko?p22 讲义:http://jyywiki.cn/OS/2021/slides/12.slides#/ 背景 回顾 操作系统是什么?一组对象 一组API…

计算机一级试题论述,计算机一级考试理论题及答案要点

计算机一级考试IT1必做题[1]. 著名的计算机科学家尼.沃思提出了________。A.数据结构+算法程序B.存储控制结构C.信息熵D.控制论[2]. 下面有关扫描仪的叙述中,错误的是________。A.分辨率是扫描仪…

(2021) 23 [持久化] I/O设备与驱动

(2021) 23 [持久化] I/O设备与驱动 南京大学操作系统课蒋炎岩老师网络课程笔记。 视频:https://www.bilibili.com/video/BV1HN41197Ko?p23 讲义:http://jyywiki.cn/OS/2021/slides/13.slides#/ 背景 很多人 (你们的同学们、家长们) 都有一个认识&…