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