Linux
Perlでの排他制御(lock)その3
通常、「データ更新」と「データ表示」のトランザクションがある。
「データ表示」は、読み込みだけであるため、排他制御は必要ない。
データ更新のトランザクション[TR1] |
open IN, '<','累計金額' or die "オープン失敗 $!";
$sum = ;
close IN;
$sum += 100;
open OUT, '>','累計金額' or die "オープン失敗 $!";
print OUT $sum;
close OUT;
|
表示だけのトランザクション[TR2] |
open IN, '<','累計金額' or die "オープン失敗 $!";
$sum = ;
close IN;
print "$sum\n";
|
を、flockで問題なようにするには、flockのLOCK_SH=1、LOCK_EX=2を使用する。
データ更新のトランザクション[TR1] |
open INOUT, '+<','累計金額' or die "オープン失敗 $!";
flock INOUT,2;
$sum = ;
$sum += 100;
truncate INOUT, 0; # ファイルサイズを0バイトにする
seek INOUT, 0, 0; # ファイルポインタを先頭に移動
print INOUT $sum;
close INOUT;
|
表示だけのトランザクション[TR2] |
open IN, '<','累計金額' or die "オープン失敗 $!";
flock INOUT,1;
$sum = ;
close IN;
print "$sum\n";
|
[TR2]だけが、同時起動された場合、flockにより停止することはない。
[TR2]のflock INOUT,1が有効な時、[TR1]のflock INOUT,2で停止し、また
[TR1]のflock INOUT,2が有効な時、[TR2]のflock INOUT,1で停止する。
また、eval { flock(OUT, 2); };のように、evalで、flockを行っているスクリプトを見かける。
これは、flockが、実装されていない場合、 perl が異常終了するのを防ぐ目的であるようも思えるが、
実装されていない場合など、正常にflockできていないことをであり、
排他制御を行っていないのと同じであることを忘れてはならない。
|