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



我应该在不更改主函数的情况下修改此代码以阻止其死锁。由于锁最终如何相互等待,因此陷入僵局,但我不知道如何阻止它。我的教授讲座谈到了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()

编辑:将任务更改为此似乎已经解决了它,尽管我认为它没有按照她想要的方式完成......

def task(lock1, lock2, count):
global x
for i in range(count):
lock1.acquire(False)
lock2.acquire(False)
# Assume that a thread can update the x value
# only after both locks have been acquired.
x+=1
print(x)
if lock2.locked():
lock2.release()
if lock1.locked():
lock1.release()

您的线程需要以一致的顺序锁定锁。您可以通过先锁定具有较低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()

使用一致的锁定顺序,两个线程不可能各自持有另一个线程需要的锁。

(multiprocessingsubprocessos.fork在这里都是无济于事的。他们只会添加更多问题。

相关内容

  • 没有找到相关文章

最新更新