死锁,递归锁,信号量

死锁问题

对同一把锁多次acquire将导致死锁,可以给acquire加上超时(timeout)来保证线程不被卡死。

from threading import Lock
l=Lock()
l.acquire()
l.acquire(timeout=3)

出现死锁的另一种情况:

一个共享资源,要访问必须同时具备多把锁,但是这些锁被不同的进程或者线程所持有,就会导致相互等待对方释放,从而程序就卡死了。

比如吃饭要碗和筷子两把锁,A抢了筷子,B抢了碗。

解决方案:

  1. 抢锁一定要按照相同的顺序去抢
  2. 给抢锁加上超时,如果超时则放弃执行

递归锁

与普通锁的区别

​ 多线程之间都有互斥的效果

​ 不同在于 同一个线程可以对这个锁 执行多次acquire

​ 同一个线程必须保证 加锁的次数和解锁的次数相同 其它线程才能够抢到这把锁

信号量

可以限制同时并发执行公共代码的线程数量

如果限制数量为1 则与普通互斥锁没有区别

from threading import Semaphore,currentThread,Thread
import time

s = Semaphore(5)

def task():
    s.acquire()
    time.sleep(1)
    print(currentThread().name)
    s.release()

for i in range(10):
    Thread(target=task).start()

注意:信号量不是用来解决安全问题的 而是用于限制最大的并发量

原文地址:https://www.cnblogs.com/zhoajiahao/p/11143820.html