さまざまなコマンドを実行するコンソールプログラムがあります。プログラムの複数のインスタンスを並行して実行できるようにしたいのですが、特定のコマンドが並行して処理されないようにしたいのです。
シンプルなファイルロックシステムを考えました。
与えられたコマンド「foo」を並行して実行することは許可されていませんが、それは機能しますか?
- fooを実行する前に、ファイル.lock_foo_ *が存在するかどうかを確認します(存在する場合は中止します)
- そうでない場合は、ファイル.lock_foo_GUIDを作成します
- .lock_foo_GUIDが存在するかどうか、および他の.lock_foo_*ファイルが存在しないかどうかを確認します
別の.lock_foo_*ファイルがある場合、それは別のインスタンスが同時に1つを作成し、ロックファイルを中止して削除することを意味します。
競合状態があるかどうか、そしてそれがそれを処理する正しい方法であるかどうか疑問に思いますか?
アップデート
実際には、当初の予想よりも簡単だと思います(少なくともWindowsでは)。バーツからの回答が私を正しい方向に導いたと思います。
私はこのようなものがうまくいくはずだと思います
public bool CreateLock(string fileName){
try{
File.Open(string.Format(".lock_{0}",fileName), FileMode.Create, FileAccess.ReadWrite, FileShare.None);
}
catch (Exception exception){
return false;
}
return true;
}
OSは、ファイルがまだ存在しない場合にのみファイルが作成されることを確認し、そうでない場合は例外を発生させます。したがって、この方法は安全なはずです。残念ながら、これはUNIXでは機能しません。