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网络编程学习笔记(一)
Jun 09 Python
Python的Flask框架中@app.route的用法教程
Mar 31 Python
python中requests模块的使用方法
Apr 08 Python
Python 常用 PEP8 编码规范详解
Jan 22 Python
Python实现的手机号归属地相关信息查询功能示例
Jun 08 Python
python代码过长的换行方法
Jul 19 Python
python try 异常处理(史上最全)
Mar 07 Python
OpenCV图像颜色反转算法详解
May 13 Python
对django layer弹窗组件的使用详解
Aug 31 Python
原来我一直安装 Python 库的姿势都不对呀
Nov 11 Python
Python unittest生成测试报告过程解析
Sep 08 Python
python 镜像环境搭建总结
Sep 23 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中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
Thinkphp中的volist标签用法简介
2014/06/18 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
2011/04/12 Javascript
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
2017/06/26 jQuery
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
解决vue点击控制单个样式的问题
2018/09/05 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
javascript验证form表单数据的案例详解
2019/03/25 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
vue 解决computed修改data数据的问题
2019/11/06 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
2020/11/07 Javascript
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
跟老齐学Python之折腾一下目录
2014/10/24 Python
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
Python中sys模块功能与用法实例详解
2020/02/26 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
模具设计与制造专业自荐书
2014/07/01 职场文书
教导处教学工作总结
2015/08/12 职场文书
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android