2016-11-13 2 views
-1

pythonスレッドを使用して最初のコードを書き込もうとしていました。.locked()は、pythonマルチスレッド環境でrelease()が呼び出された後でもTrueを返します。

それはロックが空くまだ言うように、[(ロックされても、リリース後にTrueを返します)()]コード 私はrelease()を使用してスレッドのロック解除の問題がありますを参照してください

import threading 
import time 

class thread (threading.Thread): 
    def __init__(self,t,d,arr,lock): 
     threading.Thread.__init__(self) 
     self.name=t 
     self.delay=d 
     self.array=arr; 
     self.lock=lock 
    def run(self): 
     self.fun1() 


    def fun1(self): 
     print "the thread %s want to take a lock now" %self.name 
     self.lock.acquire() 
     print "lock status just after lock acquire foe",self.name,self.lock.locked() 

     time.sleep(self.delay) 

     print "release lock for %s" %self.name 
     self.lock.release() 
     time.sleep(2) 
     print "lock status after lock release is",self.name,self.lock.locked() 
lck=threading.Lock() 
obj1=thread('T1',5,[1,2,3],lck) 
obj2=thread('T2',10,[4,5,6],lck) 


obj1.start() 
obj2.start() 

スレッドT2は、最初のロックを持って、それはそのスペースを実行:私の問題は何

OUTPUT

===== 
    the thread T1 want to take a lock now 
the thread T2 want to take a lock now 

lock status just after lock acquire foe T2 True 
release lock for T2 
lock status just after lock acquire foe T1 True 
lock status after lock release is T2 True 
release lock for T1 
lock status after lock release is T1 False 

。 T2のロック状態は、.locked()が「

ロック取得敵T2 True」の直後にロック状態であることがわかります。だからT2は今ロックされている。 T2がrelease()を使用してロックを解放すると、T1は期待通りにロックを取得しました。

しかし、release()を使用してT2をロック解除した後、lockedこれはまだT2のロックが利用可能であることを意味しますか?この場合、T1はどのようにロックを取得しましたか? T1が実行されrelease()の後に、私は見ることができます。ロックされた()はFalseを返します。 T1を意味するlocked()は、ロックを解除するとすぐに偽を返します。

したがって、一言で言えば、 ロック解除後も最初のスレッドT2がTrueを返すのはなぜですか? 1スレッドしか実行しないと、期待どおりに動作しません。

答えて

2

ロックオブジェクトをコンストラクタに渡すと、そのオブジェクトはコピーされないため、各スレッドオブジェクトはと全く同じロックにアクセスできます。ロックがあるのでTrueを返すself.lock.locked()

この結果はまだをロックしますが、この時、それは別のスレッドでをロックされています。

これは、実際に何が起こるかです:

再び
>>> import threading 
>>> lck = threading.Lock() # the 'original' 
>>> lck2 = lck # lck2 isn't a copy of lck! 
>>> lck.acquire() 
True 
>>> lck2.locked() # lck2 has been acquired as well as lck 
True 
>>> lck2.release() 
>>> lck.locked() # lck has been released as well as lck2 
False 

、これはロックオブジェクトではない(とすることはできません)の周りにコピーされ、どのような変数がいくつかのロックに割り当てられているため、それはへポイント意志起こります元のオブジェクト。

+0

私の質問に完璧な説明!!!ありがとう@ForceBru – syam

+0

@サイヤム、どうぞよろしく! – ForceBru

関連する問題