• 多任务-线程之死锁


    1.存在着资源竞争,那么就会存在着恶意竞争,当线程之间为了统一资源进行了恶意竞争时,就有可能产生死锁状态。

    2.在多线程中,面对同一个全局变量资源,会采用互斥锁来解决线程有可能会对资源做出修改的问题,从而保证了代码的完整性和准确性,但是互斥锁并不是唯一的,示例如下:

    #coding=utf-8
    import threading
    import time
    
    class MyThread1(threading.Thread):
        def run(self):
            # 对mutexA上锁
            mutexA.acquire()
    
            # mutexA上锁后,延时1秒,等待另外那个线程 把mutexB上锁
            print(self.name+'----do1---up----')
            time.sleep(1)
    
            # 此时会堵塞,因为这个mutexB已经被另外的线程抢先上锁了
            mutexB.acquire()
            print(self.name+'----do1---down----')
            mutexB.release()
    
            # 对mutexA解锁
            mutexA.release()
    
    class MyThread2(threading.Thread):
        def run(self):
            # 对mutexB上锁
            mutexB.acquire()
    
            # mutexB上锁后,延时1秒,等待另外那个线程 把mutexA上锁
            print(self.name+'----do2---up----')
            time.sleep(1)
    
            # 此时会堵塞,因为这个mutexA已经被另外的线程抢先上锁了
            mutexA.acquire()
            print(self.name+'----do2---down----')
            mutexA.release()
    
            # 对mutexB解锁
            mutexB.release()
    
    mutexA = threading.Lock()
    mutexB = threading.Lock()
    
    if __name__ == '__main__':
        t1 = MyThread1()
        t2 = MyThread2()
        t1.start()
        t2.start()
    

    当存在着多个资源时,线程A对部分资源上了锁,并且等待着其余资源,才能够打开锁,释放部分资源;同时,线程B对其余资源上锁,同时等待着部分资源,才能够释放其余资源,双方僵持,都不肯先进行释放,于是导致了死锁的产生。

    3.如何避免死锁问题的产生呢?

    • 程序设计时要尽量避免(银行家算法)
    • 添加超时时间等
  • 相关阅读:
    C语言学习11(循环结构:for语句)
    C语言学习9(循环结构:while语句)
    C语言学习8(选择结构的嵌套)
    C语言学习笔记2
    C语言学习笔记1
    C语言的学习5(数据的输出)
    C语言学习12(函数的定义)
    第二十一章流 14临时文件 简单
    第二十一章流 12输出数据到文件指定位置处seekp() 简单
    第二十一章流 11指定读取文件中的数据seekg() 简单
  • 原文地址:https://www.cnblogs.com/zxh1297/p/9353322.html
Copyright © 2020-2023  润新知