信号量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常用有三个函数 ...
随机推荐
- VMware报错“原因: 未能锁定文件”,打开失败
原文:http://jingyan.baidu.com/article/425e69e6bf64dbbe15fc16fe.html VMware打开复制的虚拟机,报错“原因: 未能锁定文件”,打开失败 ...
- DELPHI的一些开源项目GIT地址
DELPHI的一些开源项目GIT地址 Delphi-Cross-Sockethttps://github.com/winddriver/Delphi-Cross-Socket 跨平台的SOCKET库 ...
- UITableView的HeaderView和FooterView
header通过下面两个代理方法设置 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSIntege ...
- Kubernentes中的身份验证
Kubernentes中的身份验证 kubernetes 系统的各组件需要使用 TLS 证书对通信进行加密,本文档使用 CloudFlare 的 PKI 工具集 cfssl 来生成 Certifica ...
- Qt自己定义事件实现及子线程向主线程传送事件消息
近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就 ...
- [转载]DLL劫持生成器 源码开放(纯WINDOWS SDK)+ 实例分析
本菜最近学习了什么DLL注入啊,hook啊(r3)的相关技术,觉得很好玩,于是深入发现还有DLL劫持这种东西觉得挺好玩的,加上最近看到各种木马分析报告中都还有发现有利用白加黑的现象.于是自己想找几个来 ...
- 关于C++中_finite()函数的说明 [转]
The function int _finite(double x) returns 1 (true) if x is an ordinary number and 0 (false) if x is ...
- jquery调用click事件的三种方式
第一种方式: $(document).ready(function(){ $("#clickme").click(function(){ alert("Hello Wor ...
- awk使用记录
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...
- Node.js node主文件找不到时报出的Error:Cannot find module异常
如果执行>Node xx.js时,xx,js找不到的话,报出的错误是Error:Cannot find module 'c:/test/xx,js' 主文件名打错或者是点号打成逗号都会出这样的错 ...