【どくしゃかきてもんだい】

読者-書き手問題 とは?

💡 図書館の閲覧ルール、読むのは自由だけど書き込みは一人ずつ
📌 このページのポイント
読者-書き手問題(Readers-Writers Problem) 共有データ (データベース等) 読み手(Reader) Reader 1 Reader 2 Reader 3 書き手(Writer) Writer × 待機中 同時OK ✓ 排他 × バリエーション 読み手優先 読み手がいる限り 書き手は待たされる ⚠ Writer飢餓の危険 書き手優先 書き手が待っていたら 新規読み手をブロック ⚠ Reader飢餓の危険 公平方式 到着順に処理 飢餓を防止 ✓ 実装は複雑だが公正
読者-書き手問題のイメージ
ひよこ ひよこ

読者-書き手問題って何?なんだか国語の話みたいだね!

ペンギン先生 ペンギン先生

プログラミング並行処理の話だよ。図書館を想像してみて。本を読む人は何人でも同時に読めるけど、本の内容を書き換える人がいたら、その間は誰も読めないよね。これが読者-書き手問題だよ。

ひよこ ひよこ

なるほど!読むだけなら何人でもOKだけど、書くときは独占しないといけないんだね?

ペンギン先生 ペンギン先生

その通り。読み手同士はデータを変更しないから衝突しない。でも書き手がいる間に読み手がアクセスすると、書き換え途中の中途半端なデータを読んでしまう可能性があるんだ。

ひよこ ひよこ

じゃあ全部を排他ロックすれば簡単じゃないの?

ペンギン先生 ペンギン先生

それだと読み手同士も同時にアクセスできなくなって、性能がガタ落ちするんだ。読み取りが多いシステム(Webサイトとか)では、読み手の同時アクセスを許可するだけで性能が何倍にもなるよ。

ひよこ ひよこ

どうやって実装するの?

ペンギン先生 ペンギン先生

RWロック(Read-Writeロック)という仕組みを使うよ。読み手は共有ロック、書き手は排他ロックを取得する。Javaの ReadWriteLock やPythonの threading.RLock、PostgreSQLの共有ロック/排他ロックもこの考え方だね。

ひよこ ひよこ

読み手優先とか書き手優先って聞いたことがあるけど、何が違うの?

ペンギン先生 ペンギン先生

読み手優先だと、読み手がいる限り書き手はずっと待たされる。書き手がなかなか実行できない「飢餓状態」が起きるよ。逆に書き手優先だと、書き手が待っている間は新しい読み手が入れない。公平方式は到着順で処理するけど実装が複雑になるんだ。

ひよこ ひよこ

実際のシステムではどれが使われているの?

ペンギン先生 ペンギン先生

Linuxカーネルのrwlockは書き手優先、PostgreSQLMVCCは読み手がロックなしで古いバージョンを読める仕組みで、読者-書き手問題をさらに賢く解決しているよ。Webの世界では「読み取り99%・書き込み1%」みたいな偏りが多いから、RWロックの効果は絶大なんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「読者-書き手問題」って出てきたら「読むのは同時OK、書くのは一人だけという並行制御の基本問題」と思えればだいたいOK!
📖 おまけ:英語の意味
「Readers-Writers Problem」 = 読者と書き手の問題
💬 1971年にコートニー&ランポートが提唱した並行処理の古典問題だよ
← 用語集にもどる