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