Python多线程编程(五):死锁的形成


Posted in Python onApril 05, 2015

前一篇文章Python:使用threading模块实现多线程编程四[使用Lock互斥锁]我们已经开始涉及到如何使用互斥锁来保护我们的公共资源了,现在考虑下面的情况?

如果有多个公共资源,在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,这会引起什么问题?

死锁概念

所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

''' 

Created on 2012-9-8 

 

@author: walfred 

@module: thread.TreadTest5 

'''   

import threading  

 

counterA = 0  

counterB = 0  

 

mutexA = threading.Lock()  

mutexB = threading.Lock()  

 

class MyThread(threading.Thread):  

    def __init__(self):  

        threading.Thread.__init__(self)  

 

    def run(self):  

        self.fun1()  

        self.fun2()  

 

    def fun1(self):  

        global mutexA, mutexB  

        if mutexA.acquire():  

            print "I am %s , get res: %s" %(self.name, "ResA")  

 

            if mutexB.acquire():  

                print "I am %s , get res: %s" %(self.name, "ResB")  

                mutexB.release()  

 

        mutexA.release()   

 

    def fun2(self):  

        global mutexA, mutexB  

        if mutexB.acquire():  

            print "I am %s , get res: %s" %(self.name, "ResB")  

 

            if mutexA.acquire():  

                print "I am %s , get res: %s" %(self.name, "ResA")  

                mutexA.release()  

 

        mutexB.release()   

 

if __name__ == "__main__":  

    for i in range(0, 100):  

        my_thread = MyThread()  

        my_thread.start()

代码中展示了一个线程的两个功能函数分别在获取了一个竞争资源之后再次获取另外的竞争资源,我们看运行结果:

I am Thread-1 , get res: ResA

I am Thread-1 , get res: ResB

I am Thread-2 , get res: ResAI am Thread-1 , get res: ResB

可以看到,程序已经挂起在那儿了,这种现象我们就称之为”死锁“。

避免死锁

避免死锁主要方法就是:正确有序的分配资源,避免死锁算法中最有代表性的算法是Dijkstra E.W 于1968年提出的银行家算法。

Python 相关文章推荐
解决pyqt中ui编译成窗体.py中文乱码的问题
Dec 23 Python
Python利用Beautiful Soup模块搜索内容详解
Mar 29 Python
matplotlib绘图实例演示标记路径
Jan 23 Python
windows下添加Python环境变量的方法汇总
May 14 Python
python生成密码字典的方法
Jul 06 Python
Python-ElasticSearch搜索查询的讲解
Feb 25 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
Jun 02 Python
python编写扎金花小程序的实例代码
Feb 23 Python
Pytorch可视化的几种实现方法
Jun 10 Python
Python函数式编程中itertools模块详解
Sep 15 Python
分享几种python 变量合并方法
Mar 20 Python
Python多线程编程(四):使用Lock互斥锁
Apr 05 #Python
Python多线程编程(三):threading.Thread类的重要函数和方法
Apr 05 #Python
Python多线程编程(二):启动线程的两种方法
Apr 05 #Python
Python多线程编程(一):threading模块综述
Apr 05 #Python
Python中使用dom模块生成XML文件示例
Apr 05 #Python
Python中比较特别的除法运算和幂运算介绍
Apr 05 #Python
Python中使用logging模块打印log日志详解
Apr 05 #Python
You might like
基于文本的访客签到簿
2006/10/09 PHP
打造计数器DIY三步曲(中)
2006/10/09 PHP
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
2011/06/30 PHP
php匹配字符中链接地址的方法
2014/12/22 PHP
php和editplus正则表达式去除空白行
2015/04/17 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
JS常用算法实现代码
2016/11/14 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
webpack构建vue项目的详细教程(配置篇)
2017/07/17 Javascript
微信小程序实现顶部选项卡(swiper)
2020/06/19 Javascript
利用three.js画一个3D立体的正方体示例代码
2017/11/19 Javascript
element vue Array数组和Map对象的添加与删除操作
2018/11/14 Javascript
浅谈js闭包理解
2019/03/28 Javascript
layer 刷新某个页面的实现方法
2019/09/05 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
Python MD5加密实例详解
2017/08/02 Python
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
便捷提取python导入包的属性方法
2018/10/15 Python
PyCharm GUI界面开发和exe文件生成的实现
2020/03/04 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
一套比较完整的软件测试人员面试题
2012/05/13 面试题
员工薪酬激励方案
2014/06/13 职场文书
2014年保管员工作总结
2014/11/18 职场文书
优秀少先队辅导员事迹材料
2014/12/24 职场文书
golang 实现对Map进行键值自定义排序
2021/04/28 Golang