我已经在Stackoverflow上阅读了有关此主题的帖子,但无法理解要点。也许我们可以将它们的差异限制在一个特定的示例中。

有一个带锁的厕所。
互斥体:一个线程将 key 插入。如果其他任何线程需要进入马桶,他们会等待。当前的所有者出来并将 key 交给 guard (OS内核),后者将卫生间的所有者船交给另一个人。

问题陈述:我看到所有人都同意共享资源必须由锁定该线程的线程中的同一互斥锁来解锁。但是对于二进制信号量,也可以在其他任何线程中将其解锁。
现在请考虑实现信号量。

第一人称上厕所,执行wait语句,信号量结构的值从1变为0。现在,如果有其他人(其他线程)来执行wait语句,则它将阻塞,因为“value = 0” 。那么为什么总是说其他任何线程都可以解锁马桶/关键区域,特别是当没有其他线程可以进入关键区域时呢?

最佳答案

互斥锁具有线程亲和力。只有获取互斥量的线程才能释放它。信号量没有亲和力。这是互斥体的一个不错的属性,它可以避免发生意外,并且可以在遇到错误时告诉您。互斥锁也可以是递归的,允许同一线程多次获取它。防止意外死锁的对策。

有用的属性,您需要在编写并发代码时获得的所有帮助。但是可以肯定的是,信号量也可以完成这项工作。

关于c - 厕所 key 示例中的Binary Semaphore和Mutex之间的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17453998/

10-12 04:24