gpt4 book ai didi

linux - 如何在 Linux 中实现同步同一程序的多个不同副本的信号量

转载 作者:太空狗 更新时间:2023-10-29 11:38:47 27 4
gpt4 key购买 nike

我有一个可以运行多次的程序。该程序使用一个工作目录来保存/操作其运行时文件并放置结果。我想确保如果程序的多个副本同时运行,它们不会使用同一个文件夹。为此,我在创建工作目录时在工作目录中添加了一个隐藏文件,这意味着该目录正在被使用,并在程序退出时将其删除。当程序想使用某个目录作为其工作目录时,它会检查该文件是否存在,如果不存在,它将使用该目录,否则,它将使用一个同名的目录,并附加其进程 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
}

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

最佳答案

你不应该做一个 [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
}

关于linux - 如何在 Linux 中实现同步同一程序的多个不同副本的信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13329942/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com