五分钟了解Semaphore
一、前言
多个线程之间的同步,我们会用到Semaphore,翻译成中文就是信号量。使用Semaphore可以限制多个线程对同一资源的访问。我们先看下C#中对Semaphore的定义,如下图:
翻译成中文就是:
个人理解就是线程之间靠这个信号量完成通信。比如B线程必须要等A线程完成后才能工作,也可以用来控制并发的线程数,下面我们看具体的例子,代码如下:
上面代码先声明了一个Semaphore对象,构造函数中Semaphore(3,3)表示初始线程数和最大线程数,表示对同一资源的访问,最多同时允许3个线程并发执行,运行结果如下:
如果我们将值改为Semaphore(5,5),则表示可以同时并发执行5个线程,运行结果如下:
我们看到线程执行方法的第一行代码为semaphore.WaitOne(),会判断当前信号量,如果当前信号量大于0则继续执行,如果等于0则会阻塞当前线程并将信号量减1(当前为-1),直到有线程释放并将信息号。注释截图如下:
当其他线程执行完成后,执行代码semaphore.Release(),此时会将信号量加1,如果加完后信号量的值小于或等于0,则会唤醒一个阻塞在该信号量上的线程。注释截图如下:
二、原理
个人对Semaphore的理解其实比较简单,就是规定对一个公有资源同时可操作的最大线程数,wait执行数量减1操作,signal执行数量加1操作,且这两个操作由操作系统保证原子性。我们可以先看一段伪代码,如下:
代码解读:
wait(),申请资源,对信号量做减1操作,减完后如果值小于0,表示资源已经分配完,进行阻塞等待。
signal(),释放资源,对信号量做加1操作,加完后如果值小于等于0,则唤醒等待的线程并执行。
<完>
更多精彩文章,可关注我的公众号:
五分钟了解Semaphore的更多相关文章
- 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...
- [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)
[分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...
- JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)
相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...
- 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...
- 《sort帮你排序》-linux命令五分钟系列之二十六
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...
- 《sed的流艺术之四》-linux命令五分钟系列之二十四
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...
- 《sed的流艺术之三》-linux命令五分钟系列之二十三
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...
- 《sed的流艺术之二》-linux命令五分钟系列之二十二
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...
- 《sed的流艺术之一》-linux命令五分钟系列之二十一
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...
随机推荐
- Ubuntu12.10下安装Python3
设置Python3.2为默认版本 ubuntu12.10下默认安装了Python2.7和Python3.2.3,并且设置了Python2.7为默认的版本,因此如果讨厌麻烦的话,可以直接将Python3 ...
- 几个简单又实用的PHP函数
简单方便使用: /** * 将多维数组转为一维数组 * @param array $arr * @return array */ function ArrMd2Ud($arr) { #将数值第一元素作 ...
- 吴裕雄--天生自然 R语言开发学习:处理缺失数据的高级方法(续一)
#-----------------------------------# # R in Action (2nd ed): Chapter 18 # # Advanced methods for mi ...
- 旅游机票类专业名词---PNR
PNR: PNR是旅客订座记录,即Passenger Name Record的缩写,它反映了旅客的航程,航班座位占用的数量,及旅客信息.适用民航订座系统. 一个PNR由以下几项组成: 姓名组NM 航段 ...
- idea maven 项目可以运行但依赖包一直是红色
一句话!!!重启一下idea 红红的一片很烦!!!!!重启
- MobX中@computed和自定义get函数的区别
首先这两者解决方法都会得到一个相同的结果,但使用@computed的意义在于它能够由MobX进行更智能的优化. 如果我不使用computed属性,直接使用自定义的getTheValue函数的话,那么一 ...
- javascript学习内容
http协议 犀牛书 MDN js单线程 let只在代码块内有效 es5只有全局作用域 const变量指向的内存地址不得改动,值不能保证不变 全局变量不加var node.js 更改连接到服务器的方式 ...
- 年薪5w和50w的人,区别到底在哪?
年薪5w和50w的人,区别到底在哪? 2017-02-22 阿青 360投资圈 文/ 阿青 许多人在职场摸爬滚打很多年并不顺利,薪酬一直上不去.职场鸡汤喝了不少,也掌握了不少职场技能,工作经验也颇为丰 ...
- React使用笔记2--创建登录组件
文章目录 最近在学习使用React作为前端的框架,<React使用笔记>系列用于记录过程中的一些使用和解决方法.本文记录搭建登录页面的过程. 根据产品规划划分模块 主要页面逻辑 在这里,本 ...
- TOMCAT封装DBCP
## 数据源 ## #Tomcat封装的DBCP: >> 基本知识: tomcat在默认情况下已经集成了DBCP: >> JNDI: |-- 基本概念: 在tomcat启动的时 ...