Linux设备驱动程序之并发控制(四).docVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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被唤醒

文档评论(0)

docinppt + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档