Python多线程编程(五):死锁的形成

 更新时间:2015年04月05日 11:36:23   投稿:junjie  
这篇文章主要介绍了Python多线程编程(五):死锁的形成,本文讲解了死锁的概念、死锁示例、避免死锁的方法等内容,需要的朋友可以参考下

前一篇文章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中字典的key都可以是什么

    解读Python中字典的key都可以是什么

    这篇文章主要介绍了解读Python中字典的key都可以是什么,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Python实现人脸识别的详细图文教程

    Python实现人脸识别的详细图文教程

    人脸识别是人工智能的一个重要应用,下面这篇文章主要给大家介绍了关于Python实现人脸识别的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 在Python 的线程中运行协程的方法

    在Python 的线程中运行协程的方法

    这篇文章主要介绍了在Python 的线程中运行协程的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 解决python父线程关闭后子线程不关闭问题

    解决python父线程关闭后子线程不关闭问题

    这篇文章主要介绍了解决python父线程关闭后子线程不关闭问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 详解django自定义中间件处理

    详解django自定义中间件处理

    这篇文章主要介绍了详解django自定义中间件处理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Python 中单例模式的实现方法

    Python 中单例模式的实现方法

    这篇文章主要介绍了Python 中单例模式的实现方法,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以学习一下下面文章详细内容
    2022-08-08
  • python中有函数重载吗

    python中有函数重载吗

    在本篇内容里下边给大家整理的是关于python函数重载的知识点总结,有需要的朋友们可以学习下。
    2020-05-05
  • 人脸识别经典算法一 特征脸方法(Eigenface)

    人脸识别经典算法一 特征脸方法(Eigenface)

    这篇文章主要为大家详细介绍了人脸识别经典算法一,特征脸方法Eigenface,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • mac安装pytorch及系统的numpy更新方法

    mac安装pytorch及系统的numpy更新方法

    今天小编就为大家分享一篇mac安装pytorch及系统的numpy更新方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 解析Python编程中的包结构

    解析Python编程中的包结构

    这篇文章主要介绍了解析Python编程中的包结构,包括对一些包管理工具的介绍,需要的朋友可以参考下
    2015-10-10

最新评论