死锁,递归锁,信号量

死锁问题

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

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

出现死锁的另一种情况:

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

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

1639029-20190706191214614-1800973398.png

解决方案:

  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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值