2

数回実行できるプログラムがあります。プログラムは、ランタイムファイルを保存/操作し、結果を出力する作業ディレクトリを使用します。プログラムの複数のコピーが同時に実行される場合、それらが同じフォルダーを使用しないことを確認したいと思います。これを行うには、作成時に隠しファイルを作業ディレクトリに追加します。これは、ディレクトリが使用されていることを意味し、プログラムの終了時にそのファイルを削除します。プログラムが特定のディレクトリを作業ディレクトリとして使用する場合は、そのファイルが存在するかどうかを確認し、存在しない場合はそのディレクトリを使用します。存在しない場合は、プロセスIDが付加された同じ名前のディレクトリを使用します。実装は次のとおりです:(Tclで)

開始時:

if [file exists [db_work_area]/.folder_used] {
    reg set work_area_override [db_work_area]_[pid]
}
...
exec touch ${db_wa}/.folder_used

終了時:

if [file exists [db_work_area]/.folder_used] {
    file delete [db_work_area]/.folder_used
}

これは、プログラムのコピーを一度に1つずつ開くと機能しますが、プログラムの複数のコピーを同時に開くと、それらの同期に問題が発生するのではないかと心配しています。つまり、2つのプログラムがファイルが存在するかどうかを一緒にチェックし、両方がそのディレクトリを選択していないことを確認し、その後でのみファイルを追加します。実行中の同じプログラムのいくつかの異なるコピー間で同期できるセマフォを実装するにはどうすればよいですか?

4

1 に答える 1

5

後でタッチするのではなく、許可を得てワンステップで実行する[file exists]方がうまくいきます。openEXCL

このようなものを使用してファイルを作成し、アトミックな方法で既に存在する場合は失敗します。

if {[catch {open ${db_wa}/.folder_used {WRONLY EXCL CREAT}} fd]} {
    # error happend, file exists
    # pick a different area
} else {
    # just close it again, like a touch to create the file
    close $fd
}
于 2012-11-11T09:47:15.253 に答える