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中的yield浅析
Jun 16 Python
详解Python字符串对象的实现
Dec 24 Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
Aug 12 Python
Python之Numpy的超实用基础详细教程
Oct 23 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
python实现微信打飞机游戏
Mar 24 Python
python:删除离群值操作(每一行为一类数据)
Jun 08 Python
keras实现VGG16方式(预测一张图片)
Jul 07 Python
Python直接赋值及深浅拷贝原理详解
Sep 05 Python
使用python创建股票的时间序列可视化分析
Mar 03 Python
python中urllib包的网络请求教程
Apr 19 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实现的遍历文件夹下所有文件,编辑删除
2010/01/05 PHP
php入门学习知识点二 PHP简单的分页过程与原理
2011/07/14 PHP
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
SWFObject Flash js调用类
2008/07/08 Javascript
jquery实现盒子下拉效果示例代码
2013/09/12 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
HTML,CSS,JavaScript速查表推荐
2014/12/02 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
2016/04/29 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
JS闭包经典实例详解
2018/12/20 Javascript
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
vue-socket.io接收不到数据问题的解决方法
2020/05/13 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
Python2.x中str与unicode相关问题的解决方法
2015/03/30 Python
Python实现二叉堆
2016/02/03 Python
python Django批量导入数据
2016/03/25 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
python调试神器PySnooper的使用
2019/07/03 Python
python excel转换csv代码实例
2019/08/26 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
2020/03/08 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
意大利奢华内衣制造商:Cosabella
2017/08/29 全球购物
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
美国基督教约会网站:ChristianCafe.com
2020/02/04 全球购物
颁奖晚会主持词
2014/03/25 职场文书
创业计划书之DIY自助厨房
2019/09/06 职场文书