有什么理由在递归锁上使用常规锁吗?

时间:2019-07-01 09:56:46

标签: multithreading locking

当线程尝试再次获取它已经持有的递归锁时,rlock.acquire()允许线程继续并且不阻塞线程。

另一方面,当线程试图获取它已经持有的常规锁时,则该线程仅被卡在死锁中。

在我看来,第二种情况似乎只是一种麻烦,因为这种情况无法轻易恢复(线程只是卡在lock.acquire()上),而且很难诊断(无例外)被抛出或其他任何东西,线程只是卡住了。

到目前为止,我已经见过好几次了,实际上有人确实想使用RLock,但是使用常规的Lock并花了一些时间调试该问题。另一方面,我从未遇到过Lock实际上会更好的情况。可以说,当代码的某个真正关键部分不应一次被同一线程两次访问时,可以使用它,但是要想做到这一点,关键部分内部的代码需要自己调用,这将是一件很重要的事情。对程序员来说应该很明显。

因此,在任何情况下,LockRLock更好吗?如果不是这样,语言设计人员是否应该继续提供常规的Lock

1 个答案:

答案 0 :(得分:1)

假设这些是Python锁定对象,则文档显示它们完全不同。两者之间的主要区别是:

  • 任何线程都可以释放锁,而不仅仅是获得该锁的线程
  • Rlock只能由获取的线程释放
  • Rlock每次被线程获取时必须释放一次

因此,锁允许您构建线程方案,其中该锁在一个线程中获得而在另一线程中释放。一个示例可能是处理某项工作的线程管道,工作分发者获得了锁,但它是由管道中的最后一个线程释放的。