Reader/Writer Lock




前回、だいぶん偉そうなことを書いた割には、実はたいしたことなかったりするhanezoです。

最近、また怪しいものを作ろうかなと思っていまして、たまたま仕事で使ったPythonのプログラムを書いたりしています。
まあ、どこでもありそうなコードで、OSの授業で出てきそうなReader/Writer Lockクラスを書いてみました。
共有リソースに対して、複数の読む人/唯一の書く人のいずれかを許すオブジェクトです。

以下、ソースコード

# Pythonを使いはじめて2週間もたっていないので、よろしくないかもしれないです。
# なんか変なところがあったら教えてください。

from __future__ import with_statement
import thread

class ReaderReference:
  def __init__(self, owner):
    self._owner = owner

  def __enter__(self):
    with self._owner._operation:
      if self._owner._readers == 0:
        self._owner._access.acquire()
        self._owner._readers += 1

  def __exit__(self, exc_type, exc_value, traceback):
    with self._owner._operation:
      self._owner._readers -= 1
      if self._owner._readers == 0:
        self._owner._access.release()

  def acquire(self):
    self.__enter__(self)

  def release(self):
    self.__exit__(self, None, None, None)

class WriterReference:
  def __init__(self, owner):
    self._owner = owner

  def __enter__(self):
    self._owner._access.acquire()

  def __exit__(self, exc_type, exc_value, traceback):
    self._owner._access.release()

  def acquire(self):
    self.__enter__()

  def release(self):
    self.__exit__(self, None, None, None)

class ReaderWriterLock:
  def __init__(self):
    self._operation = thread.allocate_lock()
    self._access = thread.allocate_lock()
    self._readers = 0

    self.reader = ReaderReference(self)
    self.writer = WriterReference(self)

でもって、使い方は、

rwlock = ReaderWriterLock()

with rwlock.reader:
  ... reading ...

with rwlock.writer:
  ... writing ...

といった感じで使います。

僕が他で使うことを制限しない限り、ご自由にお使いください。
もちろん無保証です。

それからアルゴリズムも正しくないかもしれません。
動かなかったらごめんなさい。
気になる人は、タネンバウム氏の著作を読むことをお勧めします。
僕は、Modern Operating Systemという本で勉強しました。


One Response to “Reader/Writer Lock”

  1. umi より:

    おつかれさまです。
    ひさしぶりに覗いてみたら、hanezoさんの前回の日記に
    どきどきしてしまいました。
    どきどき。。。
    自分に甘くてだめですね。

Leave a Reply

 

2009年3月
« 2月   7月 »
1234567
891011121314
15161718192021
22232425262728
293031  

最近のコメント

最近の投稿

メタ情報

カテゴリー