如何避免Linux flock(2)独占锁请求饥饿?

7

我在Linux中使用flock(2)控制访问自制数据库中的资源,使用共享和独占锁定模式。我发现如果授予了共享锁,则另一个进程也可以获得共享锁,而不管是否有正在等待独占锁的阻塞进程。这意味着对于具有许多重叠读取器的流行资源,独占锁请求可能会饿死很长时间,甚至永远。

这种行为不违反flock(2)手册,但令我感到惊讶的是,这段代码在FreeBSD和OS-X上已经运行了多年而没有问题。我的猜测是,BSD系统必须实现某种队列来防止独占锁永久饥饿。

我的主要问题是,是否有任何简单的技巧或编程模式可以防止我的独占锁被饿死?

作为次要问题,为了满足我的好奇心,是否有人知道这在类似我怀疑的BSD系统上真的有所不同吗?


"flock" 让我想起了锁定车队。 - Ben Voigt
1个回答

0

我在FreeBSD 7.2上遇到了完全相同的问题,无法防止flock()中的写入器饥饿。您必须选择其他锁定方法,例如SysV IPC或简单的停止标志文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接