11-死锁
目标¶
- 知道多线程程序要避免死锁
现实社会中,男女双方都在等待对方先道歉
如果双方都这样固执的等待对方先开口,弄不好,就分手了
死锁¶
在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
尽管死锁很少发生,但一旦发生就会造成应用的停止响应。下面看一个死锁的例子
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()
运行结果:
我们发现,从index=5开始,就不再执行了,而正常情况下是index=5、6、7、8、9的时候都是输出下标越界,为什么没有执行呢?
解决办法:
在return 之前释放锁
# 输出内容
if index >= len(data_list):
print("%d 下标越界" % index)
# 解锁
lock.release()
return
print(data_list[index])