threading.Condition
将锁定作为参数,但如果未指定,则默认情况下使用threading.RLock
。当我在一个线程中的条件变量上调用acquire
,然后将其移交给另一个线程到wait
时,我发现了这一点。这失败了RLock
,因此解决方案是使用普通锁。默认情况下使用RLock
背后的理由是什么?
答案 0 :(得分:1)
默认情况下会使用RLock
来阻止您尝试执行此操作。为了保证谓词受到保护,在相同的线程中获取锁并等待条件。使用RLock
可以保证这一点。
当使用带有条件的Lock
时,没有隐含的保证谓词受到保护,因为锁定线程可以并行扫描它。