线程锁导致的死循环

Infinite loop caused by thread lock

为了模拟我最近遇到的情况,我写了一个非常简单的代码。但我不太明白为什么会这样。谁能详细解释一下因为使用锁导致死循环的原因

测试代码(模拟条件)

import threading


# Declare Lock
jobs_lock = threading.Lock()


while True:

    # Acquire the Lock
    jobs_lock.acquire()

    print("Lock Acquired")

    if 1:
        continue
    else:
        print("useless else")

    jobs_lock.release()

输出

Lock Acquired
<cursor-blinking>

我能想到的一种天真的方法是在我在原始代码段中使用的每次继续后释放锁。看起来像这样。

import threading


# Declare Lock
jobs_lock = threading.Lock()


while True:

    # Acquire the Lock
    jobs_lock.acquire()

    print("Lock Acquired")

    if 1:
        jobs_lock.release()
        continue
    else:
        print("useless else")

    jobs_lock.release()

谁能解释一下为什么会获得这种天性?线程是否应该不知道它拥有锁的控制权并应该继续执行代码?

当您使用 continue 时,循环体的进一步处理将被跳过,控件将移回循环顶部,即循环条件(在您的情况下是 while True: ).

一旦循环体再次开始执行,它会尝试获取在上一次循环迭代中已经获取的锁。因此你的线程将永远阻塞,因为锁永远不会被释放,因为在给定的例子中我们永远不会到达释放锁的循环部分。这将导致死锁情况,导致代码的执行暂停。

值得注意的是,线程不够聪明,无法意识到它们正在获取它们之前某个时候已经获取的锁,尽管可以编写一个包装器并使用它来保存锁和已获取的线程的映射获得它们以防止出现这种情况。

您的第二个解决方案确实正确解决了死锁问题。