鍍金池/ 問(wèn)答/Python  C  C++  Ruby  網(wǎng)絡(luò)安全/ python 可重入鎖有什么用?

python 可重入鎖有什么用?

可重入鎖:支持在同一線(xiàn)程中多次請(qǐng)求同一資源

import threading
import time
class MyThread(threading.Thread):
  def run(self):
    global num
    time.sleep(1)
    if mutex.acquire(1):
      num = num+1
      msg = self.name+' set num to '+str(num)
      print(msg)
      mutex.acquire()
      print('Do another thing.')
      mutex.release()
      mutex.release()
num = 0
mutex = threading.RLock()
def test():
  for i in range(5):
    t = MyThread()
    t.start()
if __name__ == '__main__':
  test()

那我既然一個(gè)線(xiàn)程要用兩次共享變量,我直接acquire后我就不release,干嘛要acquire兩次不是多此一舉?
直接只有一次acquire和一次release:

import threading
import time
class MyThread(threading.Thread):
  def run(self):
    global num
    time.sleep(1)
    if mutex.acquire(1):
      num = num+1
      msg = self.name+' set num to '+str(num)
      print(msg)
      print('Do another thing.')
      mutex.release()
num = 0
mutex = threading.RLock()
def test():
  for i in range(5):
    t = MyThread()
    t.start()
if __name__ == '__main__':
  test()

還是我學(xué)藝不精,說(shuō)可重入鎖是用來(lái)防止死鎖的,那么可重入鎖應(yīng)該用在什么情況下?

回答
編輯回答
情皺

可重入鎖不是這么用的,一般是在面向?qū)ο笾惺褂茫热?/p>

class A:
   def f1(self):
       mutex.acquire()
       try:
           #do something
       finally:
           mutex.release()
   def f2(self):
       mutex.acquire()
       try:
           #do something
       finally:
           mutex.release()

def run1(obj):
    obj.f1()
    obj.f2()
    
def run2(obj):
    obj.f2()
    obj.f1()

obj1 = A()
t1 = threading.Thread(target=run1, args=(obj1, ))
t2 = threading.Thread(target=run2, args=(obj1, ))
t1.start()
t2.start()

調(diào)用順序不同,而且都需要同步的時(shí)候,如果不用遞歸鎖,會(huì)死鎖。如果f1或f2不加鎖,數(shù)據(jù)不同步,報(bào)錯(cuò)

2017年3月2日 21:25