そのプログラムだとデータがぶっ壊れるよ?!
r+とw+の違いと、LOCK_EXでflock。

プログラマに仕事を頼んだり、
雇用することを考えておられる方は専門家の使い方、
あるいは面接のネタの参考にでもお読みください。
タイトルを見てニヤニヤできなかったプログラマの方は、
技術力向上のネタとしてお読みください。

みんな納得ずくで、きちんとしたシステムだと確信している。
それなのに原因不明の問題が発生する…。

簡単のため、システムのかわりに
Webサイトのアクセスカウンタを作る例を考えるとしましょう。
みんなで話し合って、アクセスカウンタを以下のように作ることにしたとします。

  1. アクセス回数を記録するファイルを用意する。最初は1と書いておく。
  2. アクセスがあったらファイル記載の数字をアクセス回数として表示する。
  3. 次の訪問者に備えてファイル記載の数字を1つ増やす。

この説明は一見するとアクセスカウンタを十分に説明しているように見えます。
しかし、確実に思い通りに動作するには考慮が足りていません。

プログラムはCPUによって実行されます。
沢山のプログラムを同時に実行するには、沢山のCPUが必要と考えるのが自然です。
しかし、実際にはCPUの数によらず、Twitterのタイムラインを流しながら、
YouTubeを再生しながら、マインスイーパ(ゲーム)など複数のプログラムを同時に実行できます。

それはOSがそれぞれのプログラムを非常に短時間で切り替えながら実行しているからです。
つまり、CPUとプログラムの数にあわせてOSはプログラムを気絶させたり、叩き起こしたりして少しずつ順番に実行しています。

しばしば忘れられてしまうのですが、
プログラムは最初から最後までノンストップで動く保証がありません。
ですから、先の説明通りにあまり考えずにさらっとプログラムを作ると
何人かの人が同時にWebサイトに訪問した際に困った問題が発生します。

まずAさんが、次いで間髪いれずにBさんがWebサイトに訪問したとします。
Aさんが訪問した際にアクセスカウンタのプログラム
(Bさんのために動く同じプログラムと区別するためにこちらをαとします)が動き、
Aさんには「1人目の訪問者です」と表示されます。
ここでOSが、Aさんの訪問に対して動いていたプログラム(α)を気絶させたとします。
つまりファイルのアクセス回数は更新されず、プログラム(α)は途中で一時停止状態になります。
次いでBさん訪問に対しても同様にアクセスカウンタのプログラム(β)が動き、
Bさんにも「1人目の訪問者です」と表示されます。
プログラム(β)はファイル記載のアクセス回数を2と書き込んで終了します。
OSがプログラム(α)を叩き起こし、アクセス回数を3と書き込んで終了します。

というわけで、AさんもBさんも記念すべき訪問者第一号となってしまいました。
最初に挙げたアクセスカウンタの説明からは想像しにくい問題の発生です。

アクセスカウンタくらいなら良いかもしれませんが、
この問題は本質的に重複してはならないものが重複するということです。
ダブルブッキング、売却済商品の重複販売など、お金と時間だけでなく信頼にも関わります。

信頼できるシステムを作るためには、日常の常識からは思い至らないような沢山の考慮が必要になってきます。

r+とw+、LOCK_EXでflock

プログラムを直接作る機会がない方はここまでです。
どうもありがとうございました。
タイトルを見てニヤニヤできなかったプログラマの方は
以下がご参考になれば幸いです。

以下のページにPHPで書かれたアクセスカウンタのサンプルプログラムがあります。
これを見ると、アクセス回数を記載のファイルの読み書きにはr+を使っています。
テキストのアクセスカウンタ – アクセスカウンタ – PHPサンプルプログラム

それはw+ではファイルが一度クリアされて0Byteになるからです。
これはflockとの兼ね合いがあるので、最後にもう一度触れます。

次はLOCK_EXです。
例えば、同一のブログ記事を同時編集するのはうまくありませんが、
同時に複数の人が同一の記事を見ることに問題はりません。
このような場合には、読み関してはデータを共有できた方が良く、
書きに関しては単独で行わねばならないため、
ファイルを共有ロックします。
アクセスカウンタはアクセス回数を複数の人が共有してはいけないので、
ファイルを排他ロックします。
LOCK_EXは排他ロックを示します。

そして、flockはたった1つのプログラムだけが
ファイルをロックできるように、OSに頼むためのものです。

最後に、w+とflockの兼ね合いです。
flockはファイルポインタを使いますから、ロック前にfopenします。
するとfopen時点ではファイルをロックできていない訳ですから、
ファイルの内容がクリアされては困るのでw+は使えないのです。

同時アクセスと排他制御

r+とw+、LOCK_EXでflockは
本質的には同時アクセスと排他制御のお話になります。

考え方としてはとても基本的なもので、
クラウドを使って複数デバイスのデータの同期をはかるとか、
スマホやパソコン、あるいはグラフィックの複数コアを使っての並列計算など、
より複雑なものを考える上では超基本になってきます。

以上、より良いシステム作りのお役に立てば幸いです。

お問い合わせについて

業務として技術コンサルティングやシステム設計・開発を行っております。
気になることがありましたらご相談下さい。
ご相談のみで完結する場合、コンサルティング費用の目安は
内容によりますが1時間で5千円〜1万円ていどです。
コンサルティングや開発を検討されるその前に、
まずはお気軽にコメントやメールでご連絡下さい。
※ご契約前のコメントやメールでのやりとりは無料です。

お問い合わせフォーム

お急ぎの場合など、ただちに業務対応が必要な場合は、こちらのお問い合わせフォームをご利用ください。かきしちカンパニーお客様窓口が直ちに対応いたします。
※窓口へのお問い合わせ、お見積もりは無料です。


お名前 (必須)

メールアドレス (必須)

題名

メッセージ本文 (必須)

Share

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*