我想在linux上的perl程序中快速实现某种锁定,这可以在不同进程之间共享。
所以我使用mkdir
作为原子操作,如果目录不存在则返回1
,如果存在则返回0
。我在关键部分之后立即删除目录。
现在,有人指出,这不是一般的好习惯(独立于语言)。我认为这很好,但我想问你的意见。
编辑: 举一个例子,我的代码看起来像这样:
while (!mkdir "lock_dir") {wait some time}
critical section
rmdir "lock_dir"
答案 0 :(得分:5)
答案 1 :(得分:2)
在目录存在之前发生意外故障(例如程序崩溃,电源故障)之前,这很好。
在此之后,程序将永远不会运行,因为锁被永久锁定(假设目录位于持久文件系统上)。
通常情况下,我会使用flock和LOCK_EXCL。
打开一个文件进行阅读+写作,如果它不存在则创建它。然后采取独占锁定,如果失败(如果你使用LOCK_NB),那么其他一些进程将其锁定。
获得锁定后,您需要保持文件打开状态。
这种方法的优点是,如果进程意外死亡(例如,崩溃,被杀或机器出现故障),锁会自动释放。