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 相关文章推荐
Python实用日期时间处理方法汇总
May 09 Python
python的else子句使用指南
Feb 27 Python
python使用matplotlib绘制折线图教程
Feb 08 Python
Python装饰器用法实例总结
Feb 07 Python
Flask之flask-session的具体使用
Jul 26 Python
Python多线程threading模块用法实例分析
May 22 Python
python3.4 将16进制转成字符串的实例
Jun 12 Python
python中自带的三个装饰器的实现
Nov 08 Python
python做接口测试的必要性
Nov 20 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
Aug 07 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
Dec 21 Python
详解用Python把PDF转为Word方法总结
Apr 27 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
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
2013/08/10 PHP
php.ini save_handler 修改不生效的解决办法
2014/07/22 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
javascript一点特殊用法
2008/05/28 Javascript
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
javascript实现颜色渐变的方法
2013/10/30 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
JS中Location使用详解
2015/05/12 Javascript
javascript实现网站加入收藏功能
2015/12/16 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
JavaScript实现水平进度条拖拽效果
2017/01/18 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
Python中查看文件名和文件路径
2017/03/31 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
对Python中gensim库word2vec的使用详解
2018/05/08 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
超简单使用Python换脸实例
2019/03/27 Python
TensorFlow2.0:张量的合并与分割实例
2020/01/19 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
学校运动会报道稿
2014/09/23 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书