假设我需要执行以下操作:
global_lock.acquire()
local_lock = threading.Lock()
local_lock.acquire()
register_local_lock(local_lock, some_associated_data)
global_lock.release()
do_some_work()
local_lock.release()
问:如何使用with
语句实现相同的目标?
P.S。在我的应用程序中,实际上存在一种解决方法,将两次锁定获取分开。但是,我认为可能会有两个锁定获取必须保持交错的情况,所以我还在发帖,还有一个问题:
问:可以通过重构消除所有交错锁定获取吗?
答案 0 :(得分:0)
Q2:是的,可以消除所有交错。查看操作系统上的任何文本。这可以追溯到Per Brink Hansen的开创性工作和“银行家的问题”。如果您以任何方式错误处理交错锁定获取,您可能会使系统陷入僵局。
在这种情况下,它看起来好像唯一的保护global_lock给出了访问threading.lock句柄的位置。这实际上是必要的吗?请注意,local_lock保护关键区域的其余部分。