使用多处理子进程解决Python中的死锁?

问题描述 投票:0回答:1

学院作业要求我们修改下面的代码以防止死锁,但不改变 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()
python multithreading multiprocessing deadlock
1个回答
3
投票

您的线程需要以一致的顺序锁定锁。您可以通过先锁定

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
在这里都没有帮助。它们只会增加更多问题。)

© www.soinside.com 2019 - 2024. All rights reserved.