死锁
死锁:在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。应尽量避免死锁。
死锁示例:
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---
'''
死锁的避免
-
acquire时使用timeout或blocking参数
- mutex.acquire([blocking])中的参数blocking如果为True,则当前线程得不到锁时就会阻塞,直到得到这个锁为止(默认为True);而如果设定blocking为False,则当前进程不会阻塞
- timeout参数默认值为-1,即永无休止,一直等待,eg,如果设置为2,则在等待该锁时,最多等待2秒种,如果在2秒钟内还未能获得锁,“转头就走”(acquire的返回值为布尔类型)
- 银行家算法(略)