所以,上周,我在研究 Mutex 和 Semaphores。我来发现这篇文章真的帮助我弄清楚信号量是什么。现在我明白了二进制信号量和互斥量之间的理论区别是什么,我仍然想知道如何实际使用它们。我目前正在使用 C#,但我找不到在这种语言中使用二进制信号量的任何方法。
有人可以发布有关如何使用二进制信号量与互斥量的任何(简单)代码示例吗?任何广泛使用的语言都可以完成这项工作。您甚至可以发布 Powershell/Bash 脚本。
所以,上周,我在研究 Mutex 和 Semaphores。我来发现这篇文章真的帮助我弄清楚信号量是什么。现在我明白了二进制信号量和互斥量之间的理论区别是什么,我仍然想知道如何实际使用它们。我目前正在使用 C#,但我找不到在这种语言中使用二进制信号量的任何方法。
有人可以发布有关如何使用二进制信号量与互斥量的任何(简单)代码示例吗?任何广泛使用的语言都可以完成这项工作。您甚至可以发布 Powershell/Bash 脚本。
一个非常粗略的近似是,如果您的执行线程需要在持有资源(即互斥体、sem)时阻塞,则不应使用互斥体。这种近似的问题在于,块在 UI 程序和中断处理程序中意味着不同的东西。阻塞是一个相对的概念。
互斥锁绑定到所有者;信号量不是。唯一可以释放互斥锁的代理是获得它的代理。信号量没有这个限制。由于这个限制,如果一个低优先级的代理阻塞了一个互斥锁上的一个高优先级的代理,监督者(内核,不管......)可以提高所有者的优先级,直到它放弃它。这可以传递地应用于解决非循环优先级反转。你不能用信号量来做到这一点,因为它们缺乏所有者的概念。
例如,线程 1 可以获取一个信号量,线程 2 可以等待它,线程 3 可以放弃它。这听起来可能很混乱,但它可能是更复杂系统的基础,其中线程 3 和 1 通过某种方式进行通信,因此线程 1 可以将资源的所有权直接交给线程 3。这不能用互斥锁来完成。
那就是说;我可以将pthread_mutex_transfer(mutex, pthread)破解到任何现有的实现中,对纯粹主义者和理论家嗤之以鼻。