信号量、二进制信号量、互斥信号量(二进制信号量 貌似只存在于VxWorks系统)

明亮 posted @ 2011年3月27日 19:37 in 【科学综合】 , 3586 阅读
本文发表于:http://fml927.is-programmer.com

二进制信号量
这种信号量有两种功能:互斥和同步。它经过精心设计,效率很高,很适合性能要求高的应用。互斥信号量也是一种Binary信号量,它专门为互斥设计的,但是如果在认为没有必要使用互斥信号量的场合可以用Binary信号量提供互斥功能(需要使用互斥信号量的特殊场合将在介绍互斥信号量中进行说明)。
一个Binary信号量有两种状态:可利用(full)和不可利用(empty)。用semTake()来获得信号量。如果使用该函数的时候,信号量处于full状态,则调用函数后信号量变为empty,否则将根据该信号量的类型把申请信号量的任务挂到相应的等待队列中。当然如果任务是不等待信号量方式,则任务继续执行。
互斥信号量
互斥信号量是一种特殊的Binary信号量,它专门用于解决互斥问题如:优先级倒置,安全删除及递归访问资源等。互斥信号量和Binary信号量有以下不同:
- 它仅用于互斥;
- 它只能由申请(take)到该信号量的任务来释放(give);
- 它不能由中断来使其为full;
- semFlush()操作是非法的;

信号量和互斥信号量

信号量和互斥信号量是在多线程环境中必备资源,很多网友对它都有很丰富的经验和深刻的教训。因为这篇文章不将重点于如何使用信号量或者是互斥,而是从概念上简述他们之间的一些关系。
  信号量一般有两种运用,一是所谓的binary semaphore,它的值只有0或者1,从技术角度看它可以产生类似于互斥的功能,但是它们有区别:
信号量的释放不一定是已经获取信号量的线程,但是互斥的释放一定要是已经获取互斥的线程。 
信号量的初始值可以是0,其他线程可以通过post或者up之类的函数增加这个值,但是互斥的初始化值一定是一个有效的值。 
信号量一般情况下无法实现递归获取和释放,但是互斥一般有递归获取和释放。 
  另外一种信号量的使用就是作为计数资源,一般而言是大于1的一个数值。当获取对应资源后,线程能够执行相应的操作,比如在生产者和消费者模型中,只有获取资源后,才能进行对应的读写操作。
  那么我们在什么情况下使用信号量或者是互斥呢?我的个人意见是对于多进程之间资源的保护,信号量的使用一般比较方便,因为如果使用互斥的话,在按照posix1标准实现的系统中,我们往往要把互斥存放在共享内存中,以便进程之间能够相互访问。如果我们运用的系统是多线程,那么互斥的使用可能更加的容易,并且相对容易调试,因为互斥的释放只能是在获取线程中,减少了线程之间的太多关联。

  • 无匹配
  • 无匹配

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter