如何让linux flock(2)免于独占锁定请求?

2wa*_*wav 5 linux freebsd flock linux-kernel

我在linux中使用flock(2)来控制对homespun数据库中资源的访问,使用共享和独占锁定模式.我发现如果授予共享锁,那么另一个进程也可以获得共享锁,无论是否有阻塞进程等待独占锁.这意味着对于具有许多重叠读者的流行资源,独占锁定请求可能会长时间饿死,也许永远.

这种行为与flock(2)手册页并不矛盾,但它令我感到惊讶,因为这段代码已经在FreeBSD和OS-X中运行多年而没有任何问题.我的猜测是BSD系统必须实现某种队列以防止独占锁永远挨饿.

我的主要问题是,是否有任何简单的技巧或编程模式来保持我的独家锁定不会挨饿?

第二个问题,为了满足我的好奇心,有没有人知道这在我怀疑的BSD系统上是否真的不同?

bla*_*aze 0

我在 FreeBSD 7.2 上遇到了完全相同的问题,并且没有找到方法来防止算法上的 writer starvation()。您必须选择其他锁定方法,例如 SysV IPC 或简单的停止标志文件。