2013-05-28 13 views
8

クラス変数をスレッドロックとして使用することを考えていました。なぜなら、グローバル変数内でロックを定義したり、デッドロックを防ぎたいからです。これは実際には機能しますか?例:Python:スレッド変数としてクラス変数を使用できますか?

import threading 

class A(object): 
    lock = threading.Lock() 
    a = 1 

    @classmethod 
    def increase_a(cls): 
     with cls.lock: 
      cls.a += 1 

私はクラスの内部または外部のどこかA.lock変数を再割り当てないでしょう考えると、私の仮定は、それが世界的なロックと同じように扱われていることでしょうか?これは正しいです?

+0

悪いアイデアのサブクラス内のロックと混同していないので、しかし(name manglingを活性化するため)__lockそれを呼び出したいことがあります。 – Chameleon

+0

あなたは精緻化できますか? –

+0

はい、私は詳しく述べます:A.lockはAメタクラス(デフォルトタイプ)で初期化されます - Aから継承されたすべてのクラスは同じロックを共有するので、 'class B(A):pass'はA.lock == Bです。 'B 'が' A.increase'を使用する場合は 'lock'になります。これはdouble' A.lock.aquire(); B.lock.aquire()#deadlock A.lock is B.lock'です。有効なパターンは、メタクラス(defualt型)をクラス初期化ロックに置き換えることで、スレッドセーフな継承が可能になります。より複雑なバグにつながるので、この場合はRLockを使用しないでください。 – Chameleon

答えて

2

あなたは取得しやすいロックへの参照を持っていて、それをクラスに格納しても問題ありません。

あなたはそれが相続の問題以来、それを使用する

関連する問題