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 isinstance函数介绍
Apr 14 Python
python使用urlparse分析网址中域名的方法
Apr 15 Python
python 三元运算符使用解析
Sep 16 Python
django框架cookie和session用法实例详解
Dec 10 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
解决Django no such table: django_session的问题
Apr 07 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
Jun 24 Python
Python的scikit-image模块实例讲解
Dec 30 Python
Python实现微信表情包炸群功能
Jan 28 Python
Python实现的扫码工具居然这么好用!
Jun 07 Python
OpenCV-Python实现轮廓拟合
Jun 08 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中经典方法实现判断多维数组是否为空
2011/10/23 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
JAVASCRIPT 对象的创建与使用
2021/03/09 Javascript
删除节点的jquery代码
2014/01/13 Javascript
一个简单的jquery的多选下拉框(自写)
2014/05/05 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
DOM 高级编程
2015/05/06 Javascript
jquery-tips悬浮提示插件分享
2015/07/31 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
vue.js源代码core scedule.js学习笔记
2017/07/03 Javascript
浅谈对Angular中的生命周期钩子的理解
2017/07/31 Javascript
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
在vue中多次调用同一个定义全局变量的实例
2018/09/25 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
Python处理JSON数据并生成条形图
2016/08/05 Python
python中的print()输出
2019/04/12 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
2019/11/28 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
2020/04/03 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
浅析HTML5的WebSocket与服务器推送事件
2016/02/19 HTML / CSS
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
中国跨镜手机配件批发在线商店:TVC-Mall
2019/08/20 全球购物
自我鉴定怎么写
2013/12/05 职场文书
交通文明倡议书
2014/05/16 职场文书
民主生活会对照检查材料范文
2014/10/01 职场文书
九年级语文教学反思
2016/03/03 职场文书
幼儿园2016年感恩节活动总结
2016/04/01 职场文书
责任书格式
2019/04/18 职场文书
小程序实现文字循环滚动动画
2021/06/14 Javascript
Oracle 触发器trigger使用案例
2022/02/24 Oracle
Python查找算法的实现 (线性、二分,分块、插值查找算法)
2022/04/24 Python