11-4 线程同步 - Lock、RLock

匿名 (未验证) 提交于 2019-12-03 00:20:01
  1. Lock
    加入锁Lock之后,在lock.acquire()和lock.release()之间的代码是线程安全的
total=0 lock=Lock() def add():     #1. dosomething1     #2. io操作     #3. dosomething3     global total     for i in range(1000000):         lock.acquire() #加锁         total +=1         lock.release() #释放  def desc():     global total     for i in range(1000000):         lock.acquire() #加锁         total -=1         lock.release() #释放  import threading thread1=threading.Thread(target=add) thread2=threading.Thread(target=desc) thread1.start() thread2.start()  thread1.join() thread2.join() print(total)  #结果:0
  • 用锁会影响性能
  • 锁会引起死锁

引起死锁的情况1

lock.acquire() lock.acquire() #在lock未释放,又加锁,就引起了死锁 # do something lock.release()

引起死锁的情况2

#使用伪代码说明 A需要变量a和b,B需要变量a和b A首先对a加锁,B对b加锁,A需要b,但是已经被B加锁,那么A无法对b加锁,导致了死锁 A(a,b) acquire(a) acquire(b)  B(a, b) acquire(b) acquire(a) 

2.RLock:在同一个线程里面,可以连续调用多次acquire,一定要注意acquire的次数要和release的次数相等
代码如上,只要把Lock改成RLock即可,这样可以解决Lock死锁情况1的问题

lock=Lock() ----> lock=RLock()
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!