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获取文件后缀名及批量更新目录下文件后缀名的方法
Nov 11 Python
python获取android设备的GPS信息脚本分享
Mar 06 Python
Python 爬虫的工具列表大全
Jan 31 Python
python实现QQ空间自动点赞功能
Apr 09 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
python中Lambda表达式详解
Nov 20 Python
关于sys.stdout和print的区别详解
Dec 05 Python
解决Python在导入文件时的FileNotFoundError问题
Apr 10 Python
Python异常处理机制结构实例解析
Jul 23 Python
如何解决python多种版本冲突问题
Oct 13 Python
用Python可视化新冠疫情数据
Jan 18 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
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
PHP文件下载类
2006/12/06 PHP
用来解析.htpasswd文件的PHP类
2012/09/05 PHP
深入php之规范编程命名小结
2013/05/15 PHP
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
tp5.1 框架查询表达式用法详解
2020/05/25 PHP
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
js 实现菜单左右滚动显示示例介绍
2013/11/21 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
[42:52]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
深入理解Django的自定义过滤器
2017/10/17 Python
在VS Code上搭建Python开发环境的方法
2018/04/06 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
Python2和3字符编码的区别知识点整理
2019/08/08 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
Python利用全连接神经网络求解MNIST问题详解
2020/01/14 Python
Python reduce函数作用及实例解析
2020/05/08 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
2020/05/16 Python
Django web自定义通用权限控制实现方法
2020/11/24 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
Java面试题汇总
2015/12/06 面试题
关于幼儿的自我评价
2013/12/18 职场文书
吃空饷专项治理工作实施方案
2014/03/04 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
办公室日常管理制度
2015/08/04 职场文书
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android