我在linux中使用flock(2)来控制对homespun数据库中资源的访问,使用共享和独占锁定模式。我发现如果授予共享锁,那么另一个进程也可以获得共享锁,无论是否有阻塞进程等待独占锁。这意味着对于具有许多重叠读者的流行资源,独占锁定请求可能会长时间饿死,也许永远。
这种行为与flock(2)手册页并不矛盾,但令我感到惊讶的是,因为这段代码在FreeBSD和OS-X中已经运行多年而没有任何问题。我的猜测是BSD系统必须实现某种队列以防止独占锁永远挨饿。
我的主要问题是,是否有任何简单的技巧或编程模式可以让我的独家锁定不会挨饿?
第二个问题,为了满足我的好奇心,有没有人知道这在我怀疑的BSD系统上是否真的不同?
答案 0 :(得分:0)
我在FreeBSD 7.2上遇到了完全相同的问题,发现没有办法阻止flock()上的编写器饥饿。您必须选择其他锁定方法,如SysV IPC或简单的停止标志文件。