linux编程之信号量
一、概念
linux信号量:
允许多个线程同时进入临界区,可以用于进程间的同步。
和互斥锁(mutex)的区别:
互斥锁只允许一个线程进入临界区。
所在头文件:
semaphore.h
二、主要函数
- 初始化函数
int sem_init(sem_t *sem, int pshared, unsigned int value)
sem:要初始化的信号量
pshared:此信号量是在进程间共享还是线程间共享
value:信号量的初始值
- 删除函数
int sem_destroy(sem_t *sem)
sem:要销毁的信号量
注意:只有用sem_init初始化的信号量才能用sem_destroy销毁
- 等待信号量函数
int sem_wait(sem_t *sem)
功能:等待信号量,如果信号量的值大于0,将信号量的值减1,立即返回;
如果信号量的值为0,则线程阻塞。相当于P操作。
成功返回0,失败返回-1。
- 释放信号量
int sem_post(sem_t *sem)
功能:释放信号量,让信号量的值加1。相当于V操作。
三、内核编程所用的信号量接口函数
linux内核和应用程序,都会使用信号量,但是它们却用的是不通的函数接口,这里标注一下内核使用的信号量函数接口,一般写驱动的时候会用得到。
- 初始化函数
void sema_init(struct semaphore *sem, int val)
sem:要初始化的信号量
value:信号量的初始值
init_MUTEX(sem)
功能:定义一个互斥锁,其实该宏的功能,是定义一个初始值为1的信号量。
init_MUTEX_LOCKED(sem)
功能:定义一个互斥锁,一个初始值为0的信号量。
- 等待信号量函数
void down(struct semaphore *sem)
功能:获得信号量,如果信号量的值大于0,将信号量的值减1,立即返回;
如果信号量的值为0,则进程睡眠,直到该信号量被释放,才能重新得到运行。
int down_interruptible(struct semaphore * sem)
功能:用来获取信号量,如果信号量大于或等于0,获取信号量;
如果信号量不可用,进程将被置为 TASK_INTERRUPTIBLE 类型的睡眠状态,
该函数由返回值来区分是正常返回(重新运行),还是被信号中断返回(重新运行)。
如果返回0,表示获得信号量正常返回;如果被信号打断,返回 -EINTR.
该函数与down()函数的区别在于,down睡眠了之后,只有信号量被释放,才能重新得到运行;
而该函数可以因为其他信号来打断这个睡眠,而得到运行,多了一种获得重新运行的途径。
int down_trylock(struct semaphore * sem)
功能:用来获取信号量,如果信号量大于或等于0,获取信号量,返回值为0;
否则立刻返回,且返回值为1,而不会睡眠。
- 释放信号量
void up(struct semaphore *sem)
功能:释放信号量,让信号量的值加1。
参考资料:Linux线程的信号量同步
linux编程之信号量的更多相关文章
- linux编程之信号量编程
信号量当我们在多用户系统,多进程系统,或是两者混合的系统中使用线程操作编写程序时,我们经常会发现我们有段临界代码,在此处我们需要保证一个进程(或是一个线程的执行)需要排他的访问一个资源.信号量有一个复 ...
- 【转载】Linux的进程间通信-信号量
原文:Linux的进程间通信-信号量 Linux的进程间通信-信号量 版权声明: 本文章内容在非商业使用前提下可无需授权任意转载.发布. 转载.发布请务必注明作者和其微博.微信公众号地址,以便读者询问 ...
- linux编程基础汇总贴
linux编程基础汇总贴http://newzol.cn/forum.php?mod=viewthread&tid=67&fromuid=3(出处: newzol) 1.管道 http ...
- linux 下的信号量参数
linux 下的信号量参数 转载自:http://blog.itpub.net/26110315/viewspace-718306/ 信号量是一种锁机制用于协调进程之间互斥的访问临界资源.以确保某种共 ...
- 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结 转载
基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...
- 【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...
- Linux 编程中的API函数和系统调用的关系【转】
转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...
- 【Linux】Semaphore信号量线程同步的例子
0. 信号量 Linux下的信号量和windows下的信号量稍有不同. Windows Windows下的信号量有一个最大值和一个初始值,初始值和最大值可以不同. 而且Windows下的信号量是一个 ...
- linux编程获取本机网络相关参数
getifaddrs()和struct ifaddrs的使用,获取本机IP 博客分类: Linux C编程 ifaddrs结构体定义如下: struct ifaddrs { struct ifad ...
随机推荐
- 一次关于()=>({})的使用
今天遇到了一个问题,值得一记 首先在我看项目代码时发现了一个问题 有一个JS的export如下 大家可以注意一下config 这里为什么要如此写法呢? 首先这里用的时ES6的箭头函数 ()=>{ ...
- 【代码笔记】Web-HTML-CSS
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 【读书笔记】iOS-解析XML
使用最广泛的解析XML文档的方法有两种,一种基于SAX,另一种基于DOM.SAX解析器是事件驱动型的,在解析时增量地读取XML文档,当解析器识别出一个结点的时候会调用相应的委托方法. 参考资料< ...
- 6个顶级Python NLP库的比较!
6个顶级Python NLP库的比较! http://blog.itpub.net/31509949/viewspace-2212320/ 自然语言处理(NLP)如今越来越流行,在深度学习开发的背景下 ...
- 【Java入门提高篇】Day21 Java容器类详解(四)ArrayList源码分析
今天要介绍的是List接口中最常用的实现类——ArrayList,本篇的源码分析基于JDK8,如果有不一致的地方,可先切换到JDK8后再进行操作. 本篇的内容主要包括这几块: 1.源码结构介绍 2.源 ...
- CentOS7:解决Packagekit占用yum问题
首先: vim /etc/yum/pluginconf.d/langpacks.conf 将第一行:enable=1改为enable=0 然后执行一下yum命令,发现还会占用,杀死线程即可.
- 记一次nginx php配置的心路历程
1.本来搞好了php的配置,想把目录下移一层 从 www.abc.com 变成 www.abc.com/wxapi ,由于我的真实文件目录比路由少了一层public 尝试了很多办法都不行 甚至想到了u ...
- Ubuntu16下配置支持Windows访问的samba共享
一.安装Ubuntu samba服务器 $ sudo apt-get install samba $ sudo apt-get install smbclient # Linux客户端测试用 二.创建 ...
- CENTOS7 SYSTEMD SERVICE 将自己的程序放入自动启动的系统服务
1. 进入文件夹cd /usr/lib/systemd/system 2. 创建文件somed.service 3. 输入内容.如果是监控类程序,需要输入Type=forking[Unit]Descr ...
- 浅谈sql server聚集索引与非聚集索引
今天同事的服务程序在执行批量插入数据操作时,会超时失败,代码debug了几遍一点问题都没有,SQL单条插入也可以正常录入数据,调试了一上午还是很迷茫,场面一度很尴尬,最后还是发现了问题的根本,原来是另 ...