2016-08-09 7 views
1

私はPythonの並行処理プリミティブを使って読み書きロックを書いています(私は思う!)。私がSOまたは他の場所で読んだ実装は、2つのロックを使用するように見えます.1つは読み取り用、もう1つは書き込み用です。実装には読み取り専用のモニタが1つしかありませんが、何かが欠けている可能性があります。誰かがこれが動作することを確認できますか?その場合、追加の書き込みロックを使用する利点は何ですか?基本となるロックが1つのみの読み書きロック?

これは、読者を優先する古典的な読み書きロックです(飢えたライターかもしれません)。ダミーキャッシュを使って読み書きを実演しています。

import threading as t 

    class ReadWriteCache(object): 
     def __init__(self): 
      self.cache = {} 
      self.reads = 0 
      self.read_cond = t.Condition(t.Lock()) 

     def read(self, key): 
      with self.read_cond:  # Register the read, so writes will wait() 
       self.reads += 1 

      result = self.cache[key] 

      with self.read_cond: 
       self.reads -= 1 
       if not self.reads: 
        self.read_cond.notify_all() 
       return result 

     def update(self, key, value): 
      with self.read_cond: 
       while self.reads: 
        self.read_cond.wait() # Wait for reads to clear 
       self.cache[key] = value  # With read lock, update value 
+0

2ロックバージョンの例はどこにありますか? – ErikR

+0

@ErikR、ここでいくつかの例を見つけることができます: –

+0

@ErikR、入力が早すぎます。以下の質問を参照してください。受け入れられた回答の各リンクと、コードを使ったpasztorpistiの回答。彼らは2つのロックを使用するか、または完成時にライターとリーダーが互いに信号を送る、何らかの二重イベントシステムを持っています。 http://stackoverflow.com/questions/16261902/python-any-way-to-get-one-process-to-have-a-write-lock-and-others-to-just-read –

答えて

1

あなたは単一のロックを使用していません。
あなたがロックと条件変数

self.read_lock = t.Condition(t.Lock()) 

を使用している条件変数があまりにも並行処理プリミティブです。ロックより複雑なもの。

注:条件変数オブジェクトを呼び出すしないでくださいread_lock

編集: あなたのコード、それはFirst readers-writers problemを解決して、私には正しいようです。あなたが言ったように、それは作家を飢えさせるかもしれません。これは小さな問題ではありません。リーダライタの背後にあるロジックは
追加のロックは、ライターが餓死しない第二のリーダライタの問題を、解決することができます書き込みよりも多くの読み取りがあるかもしれないことです。実際、読者はリソースを待っている作家がいるのを待たなければなりません。

+0

ああ、ええそれは意味をなさない - 私は実際に一緒にロックとイベントを使用していると思います。オブジェクトの名前を変更しました。正しさを再確認してください。 –

関連する問題