模拟线程上的死锁

moe*_*nad 3 python deadlock process

我有3个线程,当前正在同时运行。

def f1():
    print "running first thread\n"
    sleep(10)

def f2():
    print "running second thread\n"
    sleep(10)

def f3():
    print "running third thread\n"
    sleep(10)


if __name__ == "__main__":
    thread1 = Thread(target = f1)
    thread2 = Thread(target = f2)
    thread3 = Thread(target = f3)

    try:
        thread1 = Thread(target = f1)
        thread1.start()

        thread2 = Thread(target = f2)
        thread2.start()

        thread3 = Thread(target = f3)   
        thread3.start()

        while(thread1.isAlive() or thread2.isAlive() or thread3.isAlive()): 
            thread1.join()
            thread2.join()
            thread3.join()  
    except (KeyboardInterrupt, SystemExit):
        sys.exit()
Run Code Online (Sandbox Code Playgroud)

如何模拟死锁?另外,如何让每个线程都互相运行?还可以列出脚本中当前正在运行的所有线程吗?还是给他们优先级?

aba*_*ert 5

如何模拟死锁?

所有的死锁意味着一个或多个线程被阻止进行任何进度,因此您可以使用单个线程对其进行仿真。只是把while True:周围sleep(10)

在实际情况下,通常会有两个线程同时阻止彼此进行进度。例如,也许他们以相反的顺序使用了一对锁,所以线程1在获得锁2之前不会释放锁1,但是线程2在获得锁1之前不会释放锁2。最好通过使两个线程永久阻塞来模拟它。

如果你想真正创建一个僵局,最简单的方法是让线程相互字面上块:添加thread2.join()f1,并thread1.join()f2。然后f1无法完成,直到f2确实,f2无法完成,直到f1做,所以没有人能完成。

但是,如果要创建现实的死锁,几乎可以肯定,您将想要使用同步对象threading.Lock来完成上述的两锁方案。

另外,如何让每个线程都互相运行?

好吧,最简单的方法就是首先不要使用线程。但是,如果您确实想要,请执行以下操作:

thread1.start()
thread1.join()
thread2.start()
thread2.join()
thread3.start()
thread3.join()
Run Code Online (Sandbox Code Playgroud)

还可以列出脚本中当前正在运行的所有线程吗?

参见threading.enumerate()。除了调试目的,您通常不希望使用它。如果要以后再访问它们(在执行操作时),请在创建线程时跟踪它们。

还是给他们优先级?

正如文档所说:

当前,没有优先级,没有线程组,并且无法破坏,停止,挂起,恢复或中断线程。

如果你想要这个,你必须步骤外threading和,例如,通过使用原生API ctypeswin32api等等。