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 解析html之BeautifulSoup
Jul 07 Python
python使用datetime模块计算各种时间间隔的方法
Mar 24 Python
PHP实现发送和接收JSON请求
Jun 07 Python
pytorch 数据集图片显示方法
Jul 26 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
Jun 20 Python
Django 实现前端图片压缩功能的方法
Aug 07 Python
详解用python计算阶乘的几种方法
Aug 14 Python
Python使用matplotlib实现交换式图形显示功能示例
Sep 06 Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
Mar 13 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
Apr 14 Python
python爬虫请求库httpx和parsel解析库的使用测评
May 10 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
php 面试碰到过的问题 在此做下记录
2011/06/09 PHP
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
JavaScript实际应用:innerHTMl和确认提示的使用
2006/06/22 Javascript
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
IE6中使用position导致页面变形的解决方案(js代码)
2011/01/09 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
2014/08/18 Javascript
javascript 数组操作详解
2015/01/29 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
2018/01/09 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
Vue中引入svg图标的两种方式
2021/01/14 Vue.js
[00:43]2016完美“圣”典风云人物:单车宣传片
2016/12/02 DOTA
[00:52]DOTA2第二届亚洲邀请赛预选赛宣传片
2017/01/13 DOTA
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
Python3实现并发检验代理池地址的方法
2016/09/18 Python
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
缅甸网上购物:Shop.com.mm
2017/12/05 全球购物
美国礼品卡交易网站:Cardpool
2018/08/27 全球购物
银行工作检查书范文
2014/01/31 职场文书
网上快餐厅创业计划书
2014/02/01 职场文书
前厅收银主管岗位职责
2014/02/04 职场文书
导游个人求职信范文
2014/03/23 职场文书
元宵节晚会主持人串词
2014/03/25 职场文书
药剂专业自荐书
2014/06/20 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python