Aの実行時はBは実行不可、Bの実行時はAは実行可なロック

back
** flock が使えるのが前提 **

A 同士は実行可、ただし B 同士は実行不可なら

A
----
open(LOCK, $lock) or die "(fatal)cannot open lockfile: $!";
flock(LOCK, LOCK_SH);

# 処理

close(LOCK)
----

B
----
open(LOCK_B, "> $lock_b") or die "(fatal)cannot open lockfile(b): $!";
flock(LOCK_B, LOCK_EX | LOCK_NB) or die "already B running\n";
open(LOCK, "> $lock") or die "(fatal)cannot open lockfile: $!";
flock(LOCK, LOCK_EX | LOCK_NB) or die "already A running\n";
close(LOCK);

# 処理

close(LOCK_CGI);
----

こんな感じで、2つのロックファイル(共用・B用)を使い、B では処理前に共用ロックファイルを
アンロックすれば、B 実行中に A は実行できる。(一瞬の wait は入る可能性はある)
A が実行中は、共用ロックファイルが共有ロック(LOCK_SH)されているので、別の A は実行可能。
ただし、排他ロック(LOCK_EX)する B は実行できない。(LOCK_NB により、waitもされない)

A 同士も実行不可(ただしwait)にするならば、A のロックを共有ロックでなく
排他ロックにすれば良い。

A 同士は、waitせずにすぐ終了の場合は、ブロックしないロック(LOCK_NB)にすると、B の起動の
瞬間に A が実行できなくなるので、この場合は A 用のロックファイルを用意する方が楽。


back