multithreading - 是否有任何理由在递归锁上使用常规锁?
问题描述
当一个线程尝试再次获取它已经持有的递归锁时,rlock.acquire()
允许该线程继续并且不阻塞该线程。
另一方面,当一个线程试图获取它已经持有的常规锁时,该线程就会陷入死锁。
在我看来,第二种情况只是一个麻烦的来源,因为它是一种无法轻易恢复的情况(线程只是卡lock.acquire()
在只是卡住了)。
到目前为止,我已经看过很多次了,有人实际上想使用 anRLock
但使用的是常规Lock
并花了一段时间调试该问题。而另一方面,我从未遇到过 aLock
实际上会更好的情况。可以说,当代码的关键部分不应被同一线程一次访问两次时,可以使用它,但要发生这种情况,该关键部分内的代码需要调用自身,这将是一些事情这对程序员来说应该很明显。
那么,有没有Lock
比 an 更好的情况RLock
?如果没有,语言设计者是否应该继续提供常规Lock
?
解决方案
假设这些是 Python 锁定对象,文档显示它们完全不同。两者的主要区别在于:
- 锁可以被任何线程释放,而不仅仅是获得它的线程
- 一个 Rlock 只能被获取的线程释放
- 线程每次获取 Rlock 都必须释放一次
因此,锁允许您构建线程方案,其中锁在一个线程中获取但在另一个线程中释放。一个例子可能是处理一件工作的线程管道,工作分配器获得锁,但它被管道中的最后一个线程释放。
推荐阅读
- java - Gradle 构建两个项目(带有名称的项目和一个项目库)
- javascript - 如何解决未应用滑出动画的问题
- wcf - 在 wcf 肥皂邮递员中发送 int 数组
- r - ggplot2 中的 stat_summary_bin 如何处理?
- pyspark - 从多个文件夹中读取 Delta 表
- javascript - 如何创建可以从 material-ui 访问 ThemeProvider 的自定义 React 元素
- python - 使用 Glom 解析 JSON
- tensorflow - 这张图是daily_seasonality 和yearly_seasonality 吗?
- xcode - Xcode React-Native:链接器错误 - 清理后找不到 -lRCTTypeSafety 的库
- r - 基于具有逻辑的矩阵的行总和