前回、だいぶん偉そうなことを書いた割には、実はたいしたことなかったりする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という本で勉強しました。
おつかれさまです。
ひさしぶりに覗いてみたら、hanezoさんの前回の日記に
どきどきしてしまいました。
どきどき。。。
自分に甘くてだめですね。