学院作业要求我们修改下面的代码以防止死锁,但不改变 main 函数。
现在,由于锁最终相互等待,因此陷入了死锁。我的教授提到使用 os.fork,这是不可能的,因为我使用的是 Windows 机器。
import threading
x = 0
def task(lock1, lock2, count):
global x
for i in range(count):
lock1.acquire()
lock2.acquire()
# Assume that a thread can update the x value
# only after both locks have been acquired.
x+=1
print(x)
lock2.release()
lock1.release()
# Do not modify the main method
def main():
global x
count = 1000
lock1 = threading.Lock()
lock2 = threading.Lock()
T1 = threading.Thread(target = task, args = (lock1, lock2, count))
T2 = threading.Thread(target = task, args = (lock2, lock1, count))
T1.start()
T2.start()
T1.join()
T2.join()
print(f"x = {x}")
main()
您的线程需要以一致的顺序锁定锁。您可以通过先锁定
id
值较低的那个来完成此操作:
def task(lock1, lock2, count):
global x
if id(lock1) > id(lock2):
lock1, lock2 = lock2, lock1
for i in range(count):
lock1.acquire()
lock2.acquire()
# Assume that a thread can update the x value
# only after both locks have been acquired.
x+=1
print(x)
lock2.release()
lock1.release()
如果锁顺序一致,两个线程不可能各自持有对方需要的锁。
(
multiprocessing
、subprocess
和os.fork
在这里都没有帮助。它们只会增加更多问题。)