MST

星途 面试题库

面试题:Python多线程编程中,死锁产生的常见原因有哪些?

在Python多线程编程场景下,请阐述死锁产生的常见原因,并结合代码示例简单说明。
10.3万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

死锁产生的常见原因

  1. 资源竞争:多个线程同时竞争有限的资源,并且对资源的获取顺序不一致。例如,线程A获取资源1后尝试获取资源2,而线程B获取资源2后尝试获取资源1,如果两个线程都不释放已获取的资源,就会形成死锁。
  2. 循环依赖:线程之间形成了资源获取的循环链条。比如线程A等待线程B释放资源,线程B等待线程C释放资源,而线程C又等待线程A释放资源,从而陷入死循环。

代码示例

import threading

# 创建两个锁
lock1 = threading.Lock()
lock2 = threading.Lock()


def thread1():
    lock1.acquire()
    print('线程1获取了锁1')
    lock2.acquire()
    print('线程1获取了锁2')
    lock2.release()
    print('线程1释放了锁2')
    lock1.release()
    print('线程1释放了锁1')


def thread2():
    lock2.acquire()
    print('线程2获取了锁2')
    lock1.acquire()
    print('线程2获取了锁1')
    lock1.release()
    print('线程2释放了锁1')
    lock2.release()
    print('线程2释放了锁2')


# 创建两个线程
t1 = threading.Thread(target=thread1)
t2 = threading.Thread(target=thread2)

# 启动线程
t1.start()
t2.start()

# 等待线程结束
t1.join()
t2.join()

在上述代码中,thread1先获取lock1,再获取lock2,而thread2先获取lock2,再获取lock1。如果thread1获取了lock1,同时thread2获取了lock2,此时两个线程都在等待对方释放锁,就会导致死锁。