死锁

死锁

一致等待对方释放锁的情景

示例

# 全局变量
import threading
import time

g_num = 0

# 对g_num进行加操作
def sum_num1():
    print('sum_num1...')
    # 上锁
    mutex.acquire()
    for i in range(1000000):
        global g_num
        g_num += 1
    print(f'g_num1: {g_num}')

# 对g_num进行加操作
def sum_num2():
    print('sum_num2...')
    # 上锁
    mutex.acquire()
    for i in range(1000000):
        global g_num
        g_num += 1
    print(f'g_num2: {g_num}')

if __name__ == '__main__':
    # 创建锁
    mutex = threading.Lock()

    # 创建子线程
    sum1_thread = threading.Thread(target=sum_num1())
    sum2_thread = threading.Thread(target=sum_num2())

    # 启动线程
    sum1_thread.start()
    time.sleep(1)
    sum2_thread.start()

程序输出结果:

sum_num1...
g_num1: 1000000
sum_num2...

程序一直在等待sum_num1中释放锁,卡在了sum_num2函数中。

注意点

  1. 要在合适的地方释放锁
  2. 死锁一旦产生,程序无法继续往下执行