死锁

一、什么是死锁

  

  1、一直等待对方释放锁的情况就是死锁。

  2、类似于男女之间吵架的情况,双方一直等待对方道歉的情况。

二、死锁的使用

  

  1、要求:多线程同时根据下标在列表中取值,要保证同一时刻只能有一个线程去取值。

  

  2、列锁示例:

  

  

from threading import *

g_num = 0

# 创建锁
mutex = Lock()


def get_value(index):

    # 上锁
    mutex.acquire()
    my_list = [10,20,30]
    # 判断上标是否越界
    if index >= len(my_list):
        print("下标越界:", index)
        return

    value = my_list[index]  # 根据下标取值
    print(value)

    # 释放锁
    mutex.release()


if __name__ == '__main__':

    for i in range(10): # 循环创建10个线程
        t = Thread(target=get_value,args=(i,))
        t.start()
View Code

运行结果:

造成死锁的原因:

 

其中一个线程执行到第一次下标越界后,通过return就结束了,但是它之前创建的锁并未被释放后面的线程都在等待锁释放,所以出现了死锁的情况。

 

解决死锁的方法:

在【下标越界】的情况下也要加上释放锁的代码

from threading import *

g_num = 0

# 创建锁
mutex = Lock()


def get_value(index):

    # 上锁
    mutex.acquire()
    my_list = [10,20,30]
    # 判断上标是否越界
    if index >= len(my_list):
        print("下标越界:", index)
        mutex.release() # 在下标越界的代码处释放锁
        return

    value = my_list[index]  # 根据下标取值
    print(value)

    # 释放锁
    mutex.release()


if __name__ == '__main__':

    for i in range(10): # 循环创建10个线程
        t = Thread(target=get_value,args=(i,))
        t.start()
View Code

运行结果:

原文地址:https://www.cnblogs.com/yujiemeigui/p/14305007.html