信号量semaphore解析
1 基础概念
信号量在创建时须要设置一个初始值,表示同一时候能够有几个任务能够訪问该信号量保护的共享资源。初始值为1就变成相互排斥锁(Mutex),即同一时候仅仅能有一个任务能够訪问信号量保护的共享资源。
一个任务要想訪问共享资源,首先必须得到信号量,获取信号量的操作将把信号量的值减1。若当前信号量的值为负数,表明无法获得信号量。该任务必须挂起在该信号量的等待队列等待该信号量可用;若当前信号量的值为非负数。表示能够获得信号量,因而能够立马訪问被该信号量保护的共享资源。
当任务訪问完被信号量保护的共享资源后。必须释放信号量,释放信号量通过把信号量的值加1实现,假设信号量的值为非正数。表明有任务等待当前信号量,因此它也唤醒全部等待该信号量的任务。
信号量被看做一个对象。包括一个整型变量、一个进程等待队列和down()up()操作函数,挂起的进程直接增加等待队列,等待信号量的释放。这样,进程间的上下文切换带来了不小的开销。针对要求时间效率的加锁,特别是在多处理器的平台上,自旋锁更合适。
自旋锁没有等待队列。进程会在还有一个进程上不断自循环,等待该进程的自旋锁的释放,所以单处理器上不能够用自旋锁。
2 信号量的API
ECLARE_MUTEX(name) |
该宏声明一个信号量name并初始化它的值为0。即声明一个相互排斥锁。
DECLARE_MUTEX_LOCKED(name) |
该宏声明一个相互排斥锁name。但把它的初始值设置为0,即锁在创建时就处在已锁状态。
因此对于这样的锁,通常是先释放后获得。
void sema_init (struct semaphore *sem, int val); |
该函用于数初始化设置信号量的初值。它设置信号量sem的值为val。
void init_MUTEX (struct semaphore *sem); |
该函数用于初始化一个相互排斥锁,即它把信号量sem的值设置为1。
void init_MUTEX_LOCKED (struct semaphore *sem); |
该函数也用于初始化一个相互排斥锁,但它把信号量sem的值设置为0,即一開始就处在已锁状态。
void down(struct semaphore * sem); |
该函数用于获得信号量sem,它会导致睡眠,因此不能在中断上下文(包含IRQ上下文和softirq上下文)使用该函数。该函数将把sem的值减1。假设信号量sem的值非负。就直接返回,否则调用者将被挂起。直到别的任务释放该信号量才干继续执行。
int down_interruptible(struct semaphore * sem); |
该函数功能与down类似。不同之处为,down不会被信号(signal)打断。但down_interruptible能被信号打断,因此该函数有返回值来区分是正常返回还是被信号中断,假设返回0。表示获得信号量正常返回,假设被信号打断。返回-EINTR。
int down_trylock(struct semaphore * sem); |
该函数试着获得信号量sem。假设可以立马获得,它就获得该信号量并返回0。否则,表示不能获得信号量sem,返回值为非0值。因此,它不会导致调用者睡眠,可以在中断上下文使用。
void up(struct semaphore * sem); |
该函数释放信号量sem,即把sem的值加1,假设sem的值为非正数。表明有任务等待该信号量。因此唤醒这些等待者。
信号量semaphore解析的更多相关文章
- Java并发(十五):并发工具类——信号量Semaphore
先做总结: 1.Semaphore是什么? Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 把它比作是控制流量的红绿灯,比如XX马路要 ...
- C# 多线程之一:信号量Semaphore
通过使用一个计数器对共享资源进行访问控制,Semaphore构造器需要提供初始化的计数器(信号量)大小以及最大的计数器大小 访问共享资源时,程序首先申请一个向Semaphore申请一个许可证,Sema ...
- 经典线程同步 信号量Semaphore
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- 互斥锁Mutex与信号量Semaphore的区别
转自互斥锁Mutex与信号量Semaphore的区别 多线程编程中,常常会遇到这两个概念:Mutex和Semaphore,两者之间区别如下: 有人做过如下类比: Mutex是一把钥匙,一个人拿了就可进 ...
- 信号量 Semaphore
一.简介 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用,负责协调各个线程, 以保证它们能够正确.合理的使用公共资源. Semaphore可以控制某个资源可被同时 ...
- windows核心编程-信号量(semaphore)
线程同步的方式主要有:临界区.互斥区.事件.信号量四种方式. 前边讲过了互斥器线程同步-----windows核心编程-互斥器(Mutexes),这章我来介绍一下信号量(semaphore)线程同步. ...
- 秒杀多线程第八篇 经典线程同步 信号量Semaphore
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <且不超过最大资源数量. 第三个參数能够用来传出先前的资源计数,设为NULL表示不须要传出. 注意:当 ...
- 转:【Java并发编程】之二十三:并发新特性—信号量Semaphore(含代码)
载请注明出处:http://blog.csdn.net/ns_code/article/details/17524153 在操作系统中,信号量是个很重要的概念,它在控制进程间的协作方面有着非常重要的作 ...
- 多线程面试题系列(8):经典线程同步 信号量Semaphore
前面介绍了关键段CS.事件Event.互斥量Mutex在经典线程同步问题中的使用.本篇介绍用信号量Semaphore来解决这个问题. 首先也来看看如何使用信号量,信号量Semaphore常用有三个函数 ...
随机推荐
- 如何在AutoCAD中将卫星底图变为有坐标参考信息的
这篇博文首先没有图,主要是博主太懒了,不想再截图,我把过程说清楚也可以的.特此说明. (1)将下载好的瓦片拼接好大的地图 (2)将其导入到ArcGIS中,定义其地理坐标,如WGS84:然后将其其投影为 ...
- 永久关闭WPS热点
可以通过设置WPS,关闭广告推送和热点即可,方法如下 准备:打开已经安装wps的设备 1.单击电脑左下角,找到wps 2.选中WPS Office中的配置工具 3.在弹窗中选择“高级” 4.打开之后选 ...
- Webdriver如何启动不同浏览器(python)
WebDriver 支持 Firefox (FirefoxDriver).IE (InternetExplorerDriver).Opera (OperaDriver) 和 Chrome (Chrom ...
- awk使用记录
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...
- [SCSS] Create a gradient with a Sass loop
In this lesson, you will learn how to iteratively generate CSS selectors and attributes using Sass l ...
- 【转载】Loadrunner实现Android / IOS 手机APP压力测试
随着手机APP用户量的增大,大的手机APP一般都需要进行压力测试,这几天用了loadrunner 12进行了手机APP的压力测试,整理了下,大家可以参考参考怎样给Andorid / IOS手机APP进 ...
- 【转】WEB开发三层架构概述
关于 三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了“高内聚,低耦合” ...
- react-native 项目实战 -- 新闻客户端(1) -- 初始化项目结构
1.在项目根目录新建Componet文件夹(专门用来放我们的自定义组件),里面新建Main.js.Home.js.Message.js.Mine.js.Find.js 2.修改 index.andro ...
- 【Excle数据透视表】如何在数据透视表顶部显示列总计数据
解决方案 创建组并修改组名称为“合计” 如下图:原始数据透视表 步骤 选中列标签区域→右键→组合 修改组合的名称为“合计” 此时底部会有一个合计汇总项,只需要单击数据透视表任意单元格→数据透视表工具→ ...
- C# : 资源文件(多用于处理国际化)
1.建立Resource文件夹,添加资源文件 处理国际化的问题,我们可以添加多个资源文件,如下就是添加一个中文的,一个英文的. 2.向其中添加键值对. 3.取值 CultureInfo uiCultu ...