Python44_多任务之死锁

死锁

死锁:在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。应尽量避免死锁。

死锁示例:

import threading,time

class MyThread1(threading.Thread):
    def run(self):
        if mutexA.acquire():
            print(self.name + " ---do1--up---")
            time.sleep(1)

            if mutexB.acquire():
                print(self.name + " ---do1--down---")
                mutexB.release()
            mutexA.release()


class MyThread2(threading.Thread):
    def run(self):
        if mutexB.acquire():
            print(self.name + " ---do2--up---")
            time.sleep(1)

            if mutexA.acquire():
                print(self.name + " ---do2--down---")
                mutexA.release()
            mutexB.release()

mutexA = threading.Lock()
mutexB = threading.Lock()

if __name__ == "__main__":
    t1 = MyThread1()
    t2 = MyThread2()
    t1.start()
    t2.start()
'''输出结果如下:
Thread-1 ---do1--up---
Thread-2 ---do2--up---

'''

死锁的避免

  1. acquire时使用timeout或blocking参数
    • mutex.acquire([blocking])中的参数blocking如果为True,则当前线程得不到锁时就会阻塞,直到得到这个锁为止(默认为True);而如果设定blocking为False,则当前进程不会阻塞
    • timeout参数默认值为-1,即永无休止,一直等待,eg,如果设置为2,则在等待该锁时,最多等待2秒种,如果在2秒钟内还未能获得锁,“转头就走”(acquire的返回值为布尔类型)
  2. 银行家算法(略)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容