
&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までをロックするというのでは駄目なのでしょうか?
No.2ベストアンサー
- 回答日時:
上記のコードだと data.txt からデータを読み込んでいる意味が分かりません。
また、
> 二人の「$data」の値は同じIPアドレスになる
これも分かりません。
同時にアクセスされようとCGIは別プロセスとして実行されるので、AとBが同じ変数を取り合うこともありません。(それぞれの本来のIPが出力されます。)
これなら、lock、unlock が正しく実装されていれば問題はなさそうです。
もし、読み込んだデータを加工してファイルに戻す必要がある場合は、読み込み~加工~出力の全工程をロックしておかなければなりません。
この場合、(1)と(3)は不要です。
別プロセスとして実行されるんですね。説明が変ですいませんでした。
ロック処理はなかなか難しいのでこれからも勉強していきたいと思います。
どうもありがとうございました。
No.3
- 回答日時:
プロセスとファイル
CGIが起動し、処理し、終了する。これがプロセスです。
IPがAで起動したCGI(プロセス)とIPがBで起動したCGIは別プロセスとなりますから、その中で使ってる変数は他者から干渉されることはありません。
ならば、なぜロックが必要なのでしょうか。
それぞれのプロセスが、それぞれのプロセス用のファイルをアクセスするのであれば、これもロックの必要はありません。
しかし、アクセスする「ファイル」が唯一である、複数プロセスで共有するという
ときに、それぞれのアクセスが競合してしまう不都合がある(ファイルを壊すこ
とがある)ため、特定期間、特定処理中に処理できるプロセスが1つ以下になる
ようロックが必要になります。
読み取り専用なら必要ないでしょうが。
もちろん、ここで挙げている「ファイル」に限らず、複数のプロセスで共有して
いる「リソース」「オブジェクト」のアクセス(R/W)はロックが必要です。
あるいは、オブジェクト自体がロック機能を持っていて、意識せずアクセスでき
るものもありますが。
さて、今回のサンプルでロックについて触れるには適切でない、省略されてる
コードが多すぎると私も思います。
とりあえずは、ファイルに追加書きするだけならば、今回のロック方法で
問題はないです。
読み込んだデータを加工、変更してファイルを上書きする、なんていうときは
他の方がおっしゃるように、別の問題がでてきます。
ロック処理は難しいですね…
一つのファイルを「読み込んだデータを加工、変更してファイルを上書きする」等の処理の場合はやはりロックは非常に大切になりますね。
どうもお答えありがとうございました。
No.1
- 回答日時:
実行順として
Aのリード処理
Bのリード処理
Aのライト処理
Bのライト処理
というのがあり得るでしょう。BはAが書く前のものを参照していますから、Aが先にアクセスしていてもそのデータを読めません。つまりBの処理にはAが先にアクセスした情報は反映されないということです。リストでどんどんログを重ねていくようなプログラムなら、そこでログ飛びしてしまいます。
多数のアクセスが重なるサイトでは、しっかり対策していてもまれに不具合が出ることもありますから、こういうのはちゃんと保護されたコードにしておいた方が安定します。
単純に考えてわざわざ間に(1)や(3)を入れる必要はないと思いますが。
なるべく、ロック処理は時間が短い方がよいのかと思いまして…。
いろいろとこれからまた調べていきたいと思います。
お答えありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「Cancel = True」とはどういう...
-
VB2005 DataGridView上でクリッ...
-
別フォームから戻ったときのイ...
-
数千行HTML 画面表示の性能改善
-
エクセル アプリケーションの...
-
Perlで数値(小数点、負の数、...
-
Youtubeのバグ
-
エクセルのシート上に別のシー...
-
デジタル時計の時刻合わせの方...
-
マイページはどこを開くの
-
一定時間おきにアラームやポッ...
-
スクリプトって、何ですか?ど...
-
Javascript_submit()完了後に処...
-
Outlookでこのような表示がされ...
-
Excelでワードアートや図を常に...
-
ウインドウを毎回同じ位置、大...
-
小さな表示窓の呼び方は
-
大きい表へのスクロールバーの...
-
同じページをブラウザで複数開...
-
ウィンドウの2重起動を防止したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「Cancel = True」とはどういう...
-
別フォームから戻ったときのイ...
-
VB2005 DataGridView上でクリッ...
-
同一の検索値が複数存在する場...
-
excelのタスクバーアイコンが・...
-
処理終了後のに砂時計が、クリ...
-
VBAでグーグルにインデック...
-
VBAでIEの「Web ページからのメ...
-
エクセル アプリケーションの...
-
VC++2010 エディットボックスに...
-
C++での連続した左クリックの禁...
-
時間のかかる処理中にメッセー...
-
ASP DB検索結果の件数を事前表示
-
vba IE操作で こういう事って...
-
Sleep関数の最大時間について
-
マウスオーバー時に効果音を鳴らす
-
cgiを使用して時間制限
-
Perlで数値(小数点、負の数、...
-
【C#】ラベルのダブルクリック...
-
VB6にて、バックグラウンド処理...
おすすめ情報