<p>我偶然发现这篇文章是因为我有类似的要求。至少我是这么想的。在</p>
<p>我担心如果锁没有按FIFO的顺序释放,线程很可能会被饿死,这对我的软件来说是可怕的。在</p>
<p>读了一会儿之后,我消除了我的恐惧,意识到大家都在说:如果你想要这个,那你就错了。另外,我确信你可以依靠操作系统来完成它的工作,而不会让你的线程饿死。在</p>
<p>为了达到这一点,我做了一些挖掘工作,以便更好地理解锁在Linux下是如何工作的。我先看一下PultPosits(POSIX线程)的GLUBC源代码和规范,因为我在Linux上工作在C++上。我不知道Python是否在幕后使用pthreads,但我认为可能是这样。在</p>
<p>在周围的多个pthreads引用中,我没有找到任何关于解锁顺序的规范。在</p>
<p>我发现:Linux上pthreads中的锁是使用名为<strong><em>futex</em>的内核特性实现的。在</p>
<p><a href="http://man7.org/linux/man-pages/man2/futex.2.html" rel="nofollow">http://man7.org/linux/man-pages/man2/futex.2.html</a></p>
<p><a href="http://man7.org/linux/man-pages/man7/futex.7.html" rel="nofollow">http://man7.org/linux/man-pages/man7/futex.7.html</a></p>
<p>其中第一页的参考链接可将您引向此PDF:</p>
<p><a href="https://www.kernel.org/doc/ols/2002/ols2002-pages-479-495.pdf" rel="nofollow">https://www.kernel.org/doc/ols/2002/ols2002-pages-479-495.pdf</a></p>
<p>它解释了一些解锁策略,以及futexes如何在Linux内核中工作和实现,等等。在</p>
<p>在那里我找到了我想要的。它解释了futexes在内核中的实现方式,使得解锁大多以FIFO顺序进行(以增加公平性)。但是,这并不能保证,而且有可能一个线程可能会在一段时间内跳过一行。它们允许这样做不会使代码复杂化,并考虑到它们所获得的良好性能,而不会因为执行FIFO命令的极端措施而失去性能。在</p>
<p>所以基本上,你所拥有的是:</p>
<p>POSIX标准对互斥锁的锁定和解锁顺序没有任何要求。任何实现都可以随心所欲,因此如果您依赖于此顺序,您的代码将无法移植(即使在同一平台的不同版本之间也是如此)。</em></strong></p>
<p>pthreads库的Linux实现依赖于一种称为futex的特性/技术来实现互斥锁,它主要尝试对互斥锁进行FIFO风格的解锁,但不能保证会按照这个顺序进行。</em></strong></p>