https://blog.csdn.net/weixin_45912307/article/details/115608283
1.死锁定义: 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源, 就会造成死锁。使用互斥锁容易出现死锁
2.如何避免死锁:
- 以一个固定的顺序来取得锁,按照与取得锁相反的顺序释放锁
- 在适当的地方释放锁
- 设置加锁超时:
lock.acquire(tiemout=t)
3. 死锁代码
from threading import Thread, Lock
import time
lockA = Lock()
lockB = Lock()
class MyThreading1(Thread):
def run(self):
if lockA.acquire():
print(self.name + '获取了A锁')
time.sleep(1)
if lockB.acquire():
print(self.name + '获取了B锁,原来还有A锁')
lockB.release()
lockA.release()
class MyThreading2(Thread):
def run(self):
if lockB.acquire():
print(self.name + '获取了B锁')
time.sleep(1)
if lockA.acquire():
print(self.name + '获取了A锁,原来还有B锁')
lockA.release()
lockB.release()
if __name__ == '__main__':
t1 = MyThreading1()
t2 = MyThreading2()
t1.start()
t2.start()
t1.join()
t2.join()
"""
输出:
Thread-1获取了A锁
Thread-2获取了B锁
"""
4. timeout 解决死锁
'''
1. 避免死锁:
- 代码重构
- 加timeout 超时释放锁
- 在适当的位置释放锁
'''
from threading import Thread, Lock
import time
lockA = Lock()
lockB = Lock()
class MyThreading1(Thread):
def run(self):
if lockA.acquire():
print(self.name + '获取了A锁')
time.sleep(1)
if lockB.acquire(timeout=5): # B锁已被MyThreading2拿走
print(self.name + '获取了B锁,原来还有A锁')
lockB.release()
lockA.release()
class MyThreading2(Thread):
def run(self):
if lockB.acquire():
print(self.name + '获取了B锁')
time.sleep(1)
if lockA.acquire(timeout=5):
print(self.name + '获取了A锁,原来还有B锁')
lockA.release()
lockB.release()
if __name__ == '__main__':
t1 = MyThreading1()
t2 = MyThreading2()
t1.start()
t2.start()
t1.join()
t2.join()
"""
输出:
Thread-1获取了A锁
Thread-2获取了B锁
Thread-2获取了A锁,原来还有B锁
"""