<p>如果你的病情是这样造成的:</p>
<pre><code>lock = Lock()
cond = Condition(lock)
</code></pre>
<p>…那么是的,正如<a href="https://docs.python.org/3/library/threading.html#threading.Condition" rel="nofollow noreferrer">the docs</a>解释的那样,<code>cond.acquire()</code>只是调用<code>lock.acquire()</code>,所以你可以这样做,得到同样的效果。{和}同样。然而,它很可能会误导人类读者(也可能是静态分析工具),所以除非你有一个很好的理由,否则你不应该这样做。在</p>
<hr/>
<p>另一方面,如果它们是不相关的对象,创建方式如下:</p>
^{pr2}$
<p>…那就不行了。如果您没有获得条件使用的锁,则调用<code>cond.wait()</code>是非法的。它保证会引发<code>RuntimeError</code>。如果其他一些<code>Lock</code>对象碰巧确保没有人访问<code>cond</code>;<code>cond.wait</code>的全部意义在于它原子性地释放了<code>notify</code>上的锁和块,因此如果它没有持有它的锁,那么它作为一个条件是没有用的。在</p>
<hr/>
<p>顺便说一句,最好同时获得<code>Lock</code>s和<code>Condition</code>s<a href="https://docs.python.org/3/library/threading.html#using-locks-conditions-and-semaphores-in-the-with-statement" rel="nofollow noreferrer">in a ^{<cd12>} statement</a>:</p>
<pre><code>with cond:
with count[ipID] > 1:
cond.wait()
if ipID == 0:
time.sleep(10)
count[ipID] = count[ipID] + 1
</code></pre>
<p>按照你写东西的方式,如果在这之后<code>acquire</code>引发了异常,你永远不会释放这个条件,所以其他等待它的线程都不能被唤醒。在</p>
<p>当我们这样做时,使用<code>sleep</code>几乎总是线程设计有问题的标志。你为什么不能改成{<cd15>}?如果您有太多的假<code>notify</code>调用,您应该修复它。如果<code>count[ipID]</code>没有得到正确的重置,那么<code>while</code>循环可能会提前退出,那么修复这个问题就更重要了。不管你想用<code>sleep</code>解决什么问题,你可能只是在掩饰它。在</p>