【发布时间】:2013-07-16 13:02:01
【问题描述】:
我将flock() 用于名为互斥体的进程间(即某些进程可以决定对“some_name”进行锁定,这是通过在临时目录中锁定一个名为“some_name”的文件来实现的:
lockfile = "/tmp/some_name.lock";
fd = open(lockfile, O_CREAT);
flock(fd, LOCK_EX);
do_something();
unlink(lockfile);
flock(fd, LOCK_UN);
应该在某个时候删除锁定文件,以避免临时目录中包含数百个文件。
但是,这段代码中有一个明显的竞争条件;以进程 A、B 和 C 为例:
A opens file
A locks file
B opens file
A unlinks file
A unlocks file
B locks file (B holds a lock on the deleted file)
C opens file (a new file one is created)
C locks file (two processes hold the same named mutex !)
有没有办法在不引入这种竞争条件的情况下删除锁定文件?
【问题讨论】:
-
问题是您正在尝试实施细粒度锁定策略(文件代表资源),但您对共享粗粒度资源(文件系统)存在争用。您要么需要在更新细粒度锁之前对锁文件目录进行全局锁,要么重新设计您的锁策略。
-
您能详细说明您的需求吗?例如,如果程序都锁定相同的概念资源,为什么不让程序使用 1 个众所周知的文件名?