- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux设备驱动程序之并发控制(四).doc
出招表七:信号量(信号量其实和自旋锁是一样的,就是有一点不同:当获取不到信号量时,进程不会原地打转而是进入休眠等待状态)
Linux系统中与信号量相关的操作主要有一下4种:
1)定义信号量 struct semaphore sem;
2)初始化信号量
void sema_init (struct semphore *sem, int val); //设置sem为val
void init_MUTEX(struct semaphore *sem); //初始化一个用户互斥的信号量sem设置为1
void init_MUTEX_LOCKED(struct semaphore *sem); //初始化一个用户互斥的信号量sem设置为0
DECLARE_MUTEX(name); //该宏定义信号量name并初始化1
DECLARE_MUTEX_LOCKED(name); //该宏定义信号量name并初始化0
3)获得信号量
void down(struct semaphore *sem); //该函数用于获取信号量sem,会导致睡眠,不能被信号打断,所以不能在中断上下文使用。
int down_interruptible(struct semaphore *sem); //因其进入睡眠状态的进程能被信号打断,信号也会导致该函数返回,这是返回非0。
int down_trylock(struct semaphore *sem);//尝试获得信号量sem,如果能够获得,就获得并返回0,否则返回非0,不会导致调用者睡眠,可以在中断上下文使用
一般这样使用
if(down_interruptible(sem))
{
return - ERESTARTSYS;
}
4)释放信号量
void up(struct semaphore *sem); //释放信号量sem,唤醒等待者
信号量一般这样被使用,如下所示:
//定义信号量
DECLARE_MUTEX(mount_sem);
down(mount_sem);//获取信号量,保护临界区
…
critical section //临界区
…
up(mount_sem);
好了,下边给大家一个例子看看使用信号量来实现设备只能被一个进程打开的例子:
static DECLARE_MUTEX(xxx_lock);//定义互斥锁
static int xxx_open(struct inode *inode, struct file *filp)
{
…
if(down_trylock(xxx_lock)) //获得打开锁
return – EBUSY; //设备忙
…
return 0;//成功
}
static int xxx_release(struct inode *inode, struct file *filp)
{
up(xxx_lock); //释放打开锁
return 0;
}
在上面介绍的有关信号量的操作中,我们提到了一个问题就是信号量的初始化问题,一般对信号量的初始化是没有限制的,但如果信号量被初始化为0,则它可以用于同步,说到这里,就不得不介绍新的一招了
出招表八:同步(它意味着一个执行单元的继续执行需要等待另一个执行单元完成其事,保证了执行的先后顺序)
在这个图中,执行单元A执行代码区域b之前,必须等待执行单元B执行完代码单元c,而信号量刚好可辅助完成这一同步过程.
这时你可能要问,像这样的同步,在现实中可是常常遇到.比如,报名时必须等前一项完成了才能完成后一项..等等,是不是同步就这么一种方式啊..
呵呵,真聪明,小菜终于长大了,成为大菜了.其实,Linux系统提供了一种更好的同步机制----完成量,好吧,看在你求学若渴的份上,就把它一起传授给你了,不收费哦,呵呵
出招表九:完成量(completion),它用于一个执行单元等待另一个执行单元执行完某事
使用方法:1)定义完成量
struct completion my_completion;
2)初始化
init_completion(my_completion); //要是觉得这两步麻烦,就再给你来个宏即定义又初始化DECLARE_COMPLETION(my_completion);
3)等待完成量
void wait_for_completion(structcompletion *c); //等待一个completion被唤醒
您可能关注的文档
- HTML规则.ppt
- HTML语言..ppt
- HTML语言个人学习简记.doc
- HTML语言标记.doc
- HTML语言知识.doc
- HTML超文本标记语言.doc
- IC卡密码配置说明.doc
- IDC项目是指什么.doc
- ID联网一体机产品介绍.doc
- IE设置及office控件安装.doc
- DB34T 4359-2022 社区(村)养老服务中心(站)建设指南.pdf
- DB34T 4206-2022 饲料中癸氧喹酯的测定 高效液相色谱法.pdf
- DB34T 4371-2023 人力资源服务机构 职业技能等级认定服务规范.pdf
- DB34T 3800-2021 稻田共养生态物联网技术规程-安徽省地方标准电子版下载.pdf
- DB34T 2321-2015 杂交中籼稻免耕抛秧保护性栽培技术规程-安徽省地方标准电子版下载.pdf
- DB34T 4271-2022 区域性暴雨过程等级划分.pdf
- DB3402T 22-2021 乡村旅游集聚示范区评定规范-安徽省芜湖市地方标准电子版下载.pdf
- DB34T 3936-2021 稻麦秸秆黄贮技术规范.pdf
- DB34T 3853-2021 夏玉米花期高温热害综合防控技术规程.pdf
- 2019-2020学年湖南省益阳市桃江县高二(下)期末英语试卷.pdf
最近下载
- 《质量评估流程》课件.ppt VIP
- 17J008 挡土墙(重力式、衡重式、悬臂式)(最新).pdf VIP
- 2024年数智工程师职业鉴定考试复习题库(含答案).docx VIP
- (完整版)建筑施工技术交底范本(大全) .pdf VIP
- 水运工程大体积混凝土温度裂缝控制技术规范_JTS-T 202-1-2022.pdf
- 设备供货、安装、调试、验收方案.docx VIP
- 《水利水电工程施工图审查技术导则》.pdf VIP
- 《木材学》——李坚 木材学笔记(完整).doc VIP
- 《公路水泥混凝土路面施工技术规范》_(JTGF30-2015).pdf VIP
- 小学生数学学习自查习惯现状调查报告.pdf VIP
文档评论(0)