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 ...
随机推荐
- Vue Router滚动行为 scrollBehavior
滚动行为 使用前端路由,当切换到新路由时,想要页面滚动到顶部或者是保持原先的滚动位置,就像重新加载页面那样. vue-router能做到,而且更好,它让你可以自定义路由切换时页面如何滚动. 注意:这个 ...
- 工程设计文档服务EngineerCMS
工程设计单位或个人的设计文件分类有其特点,利用engineercms的分类目录可以很好地管理资料.多单位,多人,多工程都可以适应. 其他engineercms是一个通用的文档管理,文档协作,在线预览d ...
- Fiddler抓包使用教程-Https
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72956016 本文出自[赵彦军的博客] 开启 Https 抓包 Fiddler 默 ...
- MVC model验证 获取验证错误信息
public static class ModelStateExtensions { /// <summary> /// 获取model验证错误信息 /// </summary> ...
- Spring Boot 使用 ServletFileUpload上传文件失败,upload.parseRequest(request)为空
使用Apache Commons FileUpload组件上传文件时总是返回null,调试发现ServletFileUpload对象为空,在Spring Boot中有默认的文件上传组件,在使用Serv ...
- dell r420 H310/H810阵列配置教程及常见问题
进入H310/H810阵列卡BIOS界面 阵列卡管理快捷键 如何创建RAID0和RAID1和RAID5 阵列修复篇 Foreign(外来)状态的硬盘应如何处理 1.进入H310/H810阵列卡BIOS ...
- 【PAT】B1084 外观数列(20 分)(纯C)
第一层循环,用来循环计算第几个元素 第二层用来计算当前元素的下一个 #include<stdio.h> #include<string.h> char aaa[100000] ...
- MySQL之慢查询日志分析
在MySQL命令行中查看慢查询日志是否打开了: mysql> show variables like '%slow_query%'; +---------------------------+- ...
- VMWare:vSphere6 企业版参考序列号
HV4WC-01087-1ZJ48-031XP-9A843 NF0F3-402E3-MZR80-083QP-3CKM2 4F6FX-2W197-8ZKZ9-Y31ZM-1C3LZ JZ2E9-6D2D ...
- python学习-判断是否是私网IP地址
判断是否是私网IP地址 私网IP地址范围如下: 192.168.0.0-192.168.255.255 172.16.0.0-172.31.255.255 10.0.0.0-10.255.255.25 ...