信号量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常用有三个函数 ...
随机推荐
- CSS限制
http://www.cnblogs.com/YanPSun/archive/2012/03/16/2400141.html
- 【微信】1.微信小程序开发--入门
开始开发微信小程序咯!! ============================= 1.找到官网API地址 https://developers.weixin.qq.com/miniprogram/ ...
- VUE -- JSONP的诞生、原理及应用实例
问题: 页面中有一个按钮,点击之后会更新网页中的一个盒子的内容. Ajax可以很容易的满足这种无须刷新整个页面就可以实现数据变换的需求. 但是,Ajax有一个缺点,就是他不允许跨域请求资源. 如果我的 ...
- centos7 安装LNMP(php7)之php7.0 yum安装
http://www.jianshu.com/p/35f21210668a 安装过程参考上面的网址
- zap安装和部署
1.zap的安装 注意一点测试环境新申请的linux系统java执行路径是/usr/install/java/bin/java,安装zap的时候,会提示找不到java运行环境,解决办法是:做一个软链接 ...
- SVM相关知识及和softmax区别
1.相对于容易过度拟合训练样本的人工神经网络,支持向量机对于未见过的测试样本具有更好的推广能力. 2.SVM更偏好解释数据的简单模型---二维空间中的直线,三维空间中的平面和更高维空间中的超平面. 3 ...
- python读写文件write和flush
打开文件用open,该函数创建一个文件对象,这将用来调用与之关联的其他支持方式. file object = open(file_name [, access_mode][, buffering]) ...
- 不依赖Excel是否安装的Excel导入导出类
本文利用第三方开源库NPOI实现Excel97-2003,Excel2007+的数据导入导出操作. 不依赖Office是否安装.NPOI开源项目地址:http://npoi.codeplex.com/ ...
- 倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 21.0怎么办
编码器通讯断线异常保护,一般就是通讯线松动或者受干扰(最难以排查的情况是,我接了六套驱动器和伺服,比如J0的线是随便做的,其他五套都是西门子的合格网线,我运行程序的时候,J0如果单关节运动没任何问题, ...
- ejs - 初试
官方API: https://www.npmjs.com/package/ejs - 模板引擎 ejs文件(和普通html文件没什么区别,只是多增加了变量) <!DOCTYPE html> ...