我正在使用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 !)
有没有一种方法在不引入竞争条件的情况下,在某个时间点上删除锁定文件?