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
}

这在一次打开一个程序的副本时有效,但是我担心如果同时打开多个程序副本,它们的同步就会出现问题。这意味着两个程序将一起检查文件是否存在,看看它没有都选择那个目录,只有在那之后,他们才会添加文件。如何实现能够在运行的同一程序的多个不同副本之间同步的信号量?

4

1 回答 1

5

你不应该做一个[file exists]和以后的触摸,最好在获得许可的情况open下一步完成。EXCL

尝试使用这样的东西来创建文件,如果它已经以原子方式存在则失败。

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 回答