Linux
Perlでの排他制御(lock)その2
排他制御を行う場合、flockで無くても行える。
よく行っているのが、ロックファイル(ディレクトリ)を使用する方法である。
基本は単なる使用中の目印を自分勝手に作成するものです。
この目印が、ファイルであったり、ディレクトリであったり、symlinkであったりするのです。
sub lock{ ... }など、関数を作成してロックし、sub unlock{ ... }など、関数を作成してロック解除します。
open IN, '<','累計金額' or die "オープン失敗 $!";
$sum = ;
close IN;
$sum += 100;
open OUT, '>','累計金額' or die "オープン失敗 $!";
print OUT $sum;
close OUT;
|
に、ロック・ロック解除を追加すると
lockを入れる
open IN, '<','累計金額' or die "オープン失敗 $!";
$sum = ;
close IN;
unlockを入れる
$sum += 100;
lockを入れる
open OUT, '>','累計金額' or die "オープン失敗 $!";
print OUT $sum;
close OUT;
unlockを入れる
|
とすると、ほぼ同時に行った場合の、問題点はクリアできていない。
lockを入れる
open IN, '<','累計金額' or die "オープン失敗 $!";
$sum = ;
close IN;
$sum += 100;
open OUT, '>','累計金額' or die "オープン失敗 $!";
print OUT $sum;
close OUT;
unlockを入れる
|
となる。
よく見かける間違っているのは、読み込み処理にロックを入れない。
この様なロジックになっているものがある。
open IN, '<','累計金額' or die "オープン失敗 $!";
$sum = ;
close IN;
$sum += 100;
lockを入れる
open OUT, '>','累計金額' or die "オープン失敗 $!";
print OUT $sum;
close OUT;
unlockを入れる
|
この様にしたくなる理由は、わかるが間違いである。
|