11-死锁

目标

  • 知道多线程程序要避免死锁

现实社会中,男女双方都在等待对方先道歉

image-20180614010231088

如果双方都这样固执的等待对方先开口,弄不好,就分手了

image-20180614002941902

image-20180701231556673

死锁

在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。

尽管死锁很少发生,但一旦发生就会造成应用的停止响应。下面看一个死锁的例子

import threading

# 创建锁
lock = threading.Lock()


# 定义获取列表值得函数,参数为索引值
def get_value(index):
    # 定义列表
    data_list = [1, 3, 5, 7, 9]
    # 上锁
    lock.acquire()
    # 输出内容
    if index >= len(data_list):
        print("%d 下标越界" % index)
        return
    print(data_list[index])
    # 解锁
    lock.release()


if __name__ == '__main__':
    # 循环创建子线程访问列表
    for i in range(10):
        t1 = threading.Thread(target=get_value, args=(i, ))
        t1.start()

运行结果: lock

我们发现,从index=5开始,就不再执行了,而正常情况下是index=5、6、7、8、9的时候都是输出下标越界,为什么没有执行呢?

image-20180614102116928

解决办法:

在return 之前释放锁

# 输出内容
    if index >= len(data_list):
        print("%d 下标越界" % index)
        # 解锁
        lock.release()
        return
    print(data_list[index])