二进制信号量和互斥量之间的区别

二进制信号量和互斥量之间的区别

二进制信号量和互斥量之间是否存在差异,或它们基本相同?



阿晨1998
浏览 1333回答 3
3回答

慕娘9325324

它们不是一回事。它们用于不同的目的!虽然两种类型的信号量都具有完整/空状态并使用相同的API,但它们的使用方式却截然不同。互斥信号量互斥信号量用于保护共享资源(数据结构,文件等)。Mutex信号量由接受它的任务“拥有”。如果任务B尝试semGive当前由任务A持有的互斥锁,则任务B的调用将返回错误并失败。互斥锁始终使用以下顺序:&nbsp;&nbsp;-&nbsp;&nbsp;SemTake &nbsp;&nbsp;-&nbsp;关键部分 &nbsp;&nbsp;-&nbsp;&nbsp;SemGive这是一个简单的例子:&nbsp;&nbsp;线程A线程B. &nbsp;&nbsp;&nbsp;以Mutex为例 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;访问数据 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;......拿Mutex&nbsp;<==将阻止 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;&nbsp;提供互斥锁访问数据<==取消阻止 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;给MutexBinary SemaphoreBinary Semaphore解决了一个完全不同的问题:任务B等待发生某事(例如传感器被绊倒)。传感器跳闸和中断服务程序运行。它需要通知行程的任务。任务B应该运行并对传感器跳闸采取适当的措施。然后回去等。 &nbsp;&nbsp;&nbsp;Task&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task&nbsp;B &nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Take&nbsp;BinSemaphore&nbsp;&nbsp;&nbsp;<==&nbsp;wait&nbsp;for&nbsp;something &nbsp;&nbsp;&nbsp;Do&nbsp;Something&nbsp;Noteworthy &nbsp;&nbsp;&nbsp;Give&nbsp;BinSemaphore&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;something&nbsp;&nbsp;&nbsp;&nbsp;<==&nbsp;unblocks请注意,对于二进制信号量,B可以使用信号量和A来提供它。同样,二进制信号量不保护资源不被访问。给予和获取信号量的行为从根本上是分离的。对于相同的任务而言,通常对于给予和获取相同的二进制信号量没有多大意义。

慕姐8265434

厕所的例子是一个令人愉快的比喻:互斥:是厕所的关键。一个人可以拥有钥匙 - 占用厕所 - 当时。完成后,该人员将(释放)密钥提供给队列中的下一个人。正式说:“互斥锁通常用于序列化对一部分重入代码的访问,这些代码不能由多个线程同时执行。互斥对象只允许一个线程进入受控部分,强制其他线程尝试访问该部分要等到第一个线程退出该部分。“&nbsp;参考:Symbian开发人员库(互斥体实际上是一个值为1的信号量。)信号:是免费相同的厕所钥匙的数量。例如,我们说有四个带有相同锁和钥匙的马桶。信号量计数 - 键数 - 在开始时设置为4(所有四个厕所都是免费的),然后计数值随着人们的进入而减少。如果所有厕所都已满,即。没有剩余的自由键,信号量计数为0.现在,当eq。一个人离开厕所,信号量增加到1(一个自由键),并给予队列中的下一个人。正式地说:“信号量将共享资源的同时用户数量限制为最大数量。线程可以请求访问资源(递减信号量),并且可以发信号通知他们已经完成了使用资源(递增信号量)。 “&nbsp;参考:Symbian开发人员库

RISEBY

Mutex只能由获取它的线程释放,而您可以从任何其他线程(或进程)发出信号量信号,因此信号量更适合某些同步问题,如producer-consumer。在Windows上,二进制信号量更像是事件对象而不是互斥体。
打开App,查看更多内容
随时随地看视频慕课网APP