- ベストアンサー
排他制御のためのロックについて
&lock; #--->ロック処理 open(IN,"data.txt"); $data = <IN>; close(IN); &unlock; #--->アンロック処理(1) $data = $ENV{'REMOTE_ADDR'}.\n;#-->(2) &lock; #--->ロック処理(3) open (OUT,">>data.txt"); print OUT "$data"; close (OUT); &unlock; #--->アンロック処理 ということをした場合、一度目のアンロック処理((1))と、二度目のロック処理((3))の間は何もロックはしてないことになりますよね? もし、仮に(1)~(3)の処理をするのに3秒もかかるとします。 そのとき、 ・AとBの2人が別々のIPを持った状態で、上記が記述されたCGIに1秒差でアクセスして、「(2)」が2人によって1秒違いで実行される。 という場合では、二人の「$data」の値は同じIPアドレスになる(最初に実行した方が、後で実行された$dataの値によって上書きされる)のでしょうか? それとも、$dataの二人とも別々の本来のIPアドレスがdata.txtに書き込まれるのでしょうか? もし、同じIPアドレスになったとしたら、open~closeまでをロックするというのでは駄目なのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
上記のコードだと data.txt からデータを読み込んでいる意味が分かりません。 また、 > 二人の「$data」の値は同じIPアドレスになる これも分かりません。 同時にアクセスされようとCGIは別プロセスとして実行されるので、AとBが同じ変数を取り合うこともありません。(それぞれの本来のIPが出力されます。) これなら、lock、unlock が正しく実装されていれば問題はなさそうです。 もし、読み込んだデータを加工してファイルに戻す必要がある場合は、読み込み~加工~出力の全工程をロックしておかなければなりません。 この場合、(1)と(3)は不要です。
その他の回答 (2)
- VanillaTea
- ベストアンサー率52% (13/25)
プロセスとファイル CGIが起動し、処理し、終了する。これがプロセスです。 IPがAで起動したCGI(プロセス)とIPがBで起動したCGIは別プロセスとなりますから、その中で使ってる変数は他者から干渉されることはありません。 ならば、なぜロックが必要なのでしょうか。 それぞれのプロセスが、それぞれのプロセス用のファイルをアクセスするのであれば、これもロックの必要はありません。 しかし、アクセスする「ファイル」が唯一である、複数プロセスで共有するという ときに、それぞれのアクセスが競合してしまう不都合がある(ファイルを壊すこ とがある)ため、特定期間、特定処理中に処理できるプロセスが1つ以下になる ようロックが必要になります。 読み取り専用なら必要ないでしょうが。 もちろん、ここで挙げている「ファイル」に限らず、複数のプロセスで共有して いる「リソース」「オブジェクト」のアクセス(R/W)はロックが必要です。 あるいは、オブジェクト自体がロック機能を持っていて、意識せずアクセスでき るものもありますが。 さて、今回のサンプルでロックについて触れるには適切でない、省略されてる コードが多すぎると私も思います。 とりあえずは、ファイルに追加書きするだけならば、今回のロック方法で 問題はないです。 読み込んだデータを加工、変更してファイルを上書きする、なんていうときは 他の方がおっしゃるように、別の問題がでてきます。
お礼
ロック処理は難しいですね… 一つのファイルを「読み込んだデータを加工、変更してファイルを上書きする」等の処理の場合はやはりロックは非常に大切になりますね。 どうもお答えありがとうございました。
- ShaneOMac
- ベストアンサー率39% (356/898)
実行順として Aのリード処理 Bのリード処理 Aのライト処理 Bのライト処理 というのがあり得るでしょう。BはAが書く前のものを参照していますから、Aが先にアクセスしていてもそのデータを読めません。つまりBの処理にはAが先にアクセスした情報は反映されないということです。リストでどんどんログを重ねていくようなプログラムなら、そこでログ飛びしてしまいます。 多数のアクセスが重なるサイトでは、しっかり対策していてもまれに不具合が出ることもありますから、こういうのはちゃんと保護されたコードにしておいた方が安定します。 単純に考えてわざわざ間に(1)や(3)を入れる必要はないと思いますが。
お礼
なるべく、ロック処理は時間が短い方がよいのかと思いまして…。 いろいろとこれからまた調べていきたいと思います。 お答えありがとうございました。
お礼
別プロセスとして実行されるんですね。説明が変ですいませんでした。 ロック処理はなかなか難しいのでこれからも勉強していきたいと思います。 どうもありがとうございました。