二进制信号量与互斥量的区别

二进制信号量和互斥量之间是否有区别,还是基本相同?


他们不是一回事。 它们被用于不同的目的!
虽然两种类型的信号都具有完全/空状态并使用相同的API,但它们的用法却非常不同。

互斥信号量
互斥信号用于保护共享资源(数据结构,文件等)。

一个互斥信号是由拥有它的任务“拥有”的。 如果任务B尝试调用当前由任务A持有的互斥量,则任务B的调用将返回错误并失败。

互斥量总是使用以下顺序:

  - SemTake
  - Critical Section
  - SemGive

这是一个简单的例子:

  Thread A                     Thread B
   Take Mutex
     access data
     ...                        Take Mutex  <== Will block
     ...
   Give Mutex                     access data  <== Unblocks
                                  ...
                                Give Mutex

二进制信号量
二进制信号量解决了完全不同的问题:

  • 任务B被等待发生某种事情(例如传感器被触发)。
  • 传感器跳闸和中断服务例程运行。 它需要通知旅行的任务。
  • 任务B应该运行并采取适当的措施来进行传感器行程。 然后回去等待。
  • 
       Task A                      Task B
       ...                         Take BinSemaphore   <== wait for something
       Do Something Noteworthy
       Give BinSemaphore           do something    <== unblocks
    

    请注意,对于二进制信号量,B采取信号量和A给予它是可以的。
    同样,二进制信号量不会保护资源免受访问。 给予和采取信号量的行为从根本上是分离的。
    对于同样的任务来说,给予和采用相同的二进制信号量通常是没有意义的。


    互斥量只能由获取它的线程释放,而您可以从任何其他线程(或进程)发出信号量,因此信号量更适合生产者和消费者之类的一些同步问题。

    在Windows上,二进制信号量更像事件对象而不是互斥量。


    厕所的例子是一个令人愉快的比喻:

    互斥:

    是厕所的关键。 一个人当时可以拥有钥匙 - 占据厕所 - 。 完成后,该人员给队列中的下一个人(释放)钥匙。

    正式地说:“互斥对象通常用于串行访问一段不能同时被多个线程执行的重入代码段,一个互斥对象只允许一个线程进入受控段,强制其他尝试访问的线程该部分要等到第一个线程退出该部分。“ 参考:Symbian开发人员库

    (互斥量实际上是一个值为1的信号量。)

    信号:

    免费的相同马桶钥匙的数量。 例如,假设我们有四个带相同锁和钥匙的厕所。 信号计数 - 密钥计数 - 在开始时设置为4(所有四个厕所都是免费的),然后计数值随着人们进入而减少。如果所有的厕所都已满,即。 没有空闲密钥,信号计数为0.现在,当等式 一个人离开厕所,信号量增加到1(一个免费钥匙),并给予队列中的下一个人。

    正式地说:“信号量将共享资源的并发用户数限制在最大数量,线程可以请求访问资源(递减信号量),并可以表示他们已经完成使用资源(增加信号量)。 “ 参考:Symbian开发人员库

    链接地址: http://www.djcxy.com/p/43609.html

    上一篇: Difference between binary semaphore and mutex

    下一篇: List of remotes for a git repository?