信号量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常用有三个函数 ...
随机推荐
- Spring的AOP浅尝
项目中使用到了Spring,写了一个简单的例子,跟大家分享一下,由于自己写东西,所以在技术选择上充分自由,虽然对于Spring的利弊众说纷纭,我也不能评判,反正我是尝试用了,记得在上学时候老师讲Spr ...
- Linux中常使用的宏判断的几个例子
示例一 #ifdef CONFIG_XX1 ...... #endif 示例二 #ifdef CONFIG_XX1 ...... #else ...... #endif 示例三 #if defined ...
- Android AIDL实例解析
AIDL这项技术在我们的开发中一般来说并不是很常用,虽然自己也使用新浪微博的SSO登录,其原理就是使用AIDL,但是自己一直没有动手完整的写过AIDL的例子,所以就有了这篇简单的文章. AIDL(An ...
- 关联模型中如果condition条件
在练习中,有一个user表和地址表,一对多的关系. 我的想法是,通过这个关联模型找出这个用户下面默认值字段为1的地址 控制器中 public function index(){ $User = D(' ...
- java的几个概念AOP、IOC、DI、DIP、工厂模式、IOC容器
1.AOP:面向切面编程 把一些公共类,比如日志类.安全类.数据库连接类.系统统一的认证.权限管理类.资源池(如数据库连接池的管理).性能监控等做成一个公共类,当其他类需要时,进行注入(调用).这样这 ...
- nginx的301与302如何配置
转自:http://blog.sina.com.cn/s/blog_5d73ba76010145rr.html 首先看一个完整代码示例,关于nginx 301 302跳转的. 301跳转设置: ser ...
- Spring获取properties文件中的属性
1.前言 本文主要是对这两篇blog的整理,感谢作者的分享 Spring使用程序方式读取properties文件 Spring通过@Value注解注入属性的几种方式 2.配置文件 applicatio ...
- ITIL,是否已是昨日黄花
首先声明自己不是ITIL方面的专家,特别是具体的规范细节,后面论述如有不当,请指正.但我为什么会提起它?主要是因为它和运维(IT服务管理)相关性太大了.早起的运维完全就是以ITIL来蓝本构建的,在当时 ...
- Android NDK生成共享库和静态库
Date: 2014-03-14 Title: Compile Android Native Binary And Library Published: true Type: post Tags: A ...
- Angular 学习笔记——模块之间的通讯
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...