多任务-线程之死锁

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.如何避免死锁问题的产生呢?

  • 程序设计时要尽量避免(银行家算法)
  • 添加超时时间等

 

posted @ 2018-07-23 10:26  zxh_python  阅读(283)  评论(0编辑  收藏  举报