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发送邮件示例(支持中文邮件标题)
Feb 16 Python
Python访问纯真IP数据库脚本分享
Jun 29 Python
python中如何使用正则表达式的非贪婪模式示例
Oct 09 Python
对python抓取需要登录网站数据的方法详解
May 21 Python
Python图像处理之gif动态图的解析与合成操作详解
Dec 30 Python
pandas 如何分割字符的实现方法
Jul 29 Python
Python语法垃圾回收机制原理解析
Mar 25 Python
Python PIL库图片灰化处理
Apr 07 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
python高级特性简介
Aug 13 Python
python 绘制国旗的示例
Sep 27 Python
python import 上级目录的导入
Nov 03 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删除数组中空值的方法介绍
2014/04/14 PHP
php实现两表合并成新表并且有序排列的方法
2014/12/05 PHP
php实现简单的权限管理的示例代码
2017/08/25 PHP
RSA实现JS前端加密与PHP后端解密功能示例
2019/08/05 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
jquery 注意事项与常用语法小结
2010/06/07 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
AngularJS基础 ng-src 指令简单示例
2016/08/03 Javascript
JS实现上传图片实时预览功能
2017/05/22 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
swiper自定义分页器的样式
2020/09/14 Javascript
centos系统升级python 2.7.3
2014/07/03 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
python 创建一维的0向量实例
2019/12/02 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
Python同时迭代多个序列的方法
2020/07/28 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
2020/11/17 Python
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
十佳教师事迹材料
2014/01/11 职场文书
实习证明格式范文
2015/06/16 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
运动会广播稿200字
2015/08/19 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
MySQL高级进阶sql语句总结大全
2022/03/16 MySQL
Python数据处理的三个实用技巧分享
2022/04/01 Python