我在Linux中使用flock(2)控制访问自制数据库中的资源,使用共享和独占锁定模式。我发现如果授予了共享锁,则另一个进程也可以获得共享锁,而不管是否有正在等待独占锁的阻塞进程。这意味着对于具有许多重叠读取器的流行资源,独占锁请求可能会饿死很长时间,甚至永远。
这种行为不违反flock(2)手册,但令我感到惊讶的是,这段代码在FreeBSD和OS-X上已经运行了多年而没有问题。我的猜测是,BSD系统必须实现某种队列来防止独占锁永久饥饿。
我的主要问题是,是否有任何简单的技巧或编程模式可以防止我的独占锁被饿死?
作为次要问题,为了满足我的好奇心,是否有人知道这在类似我怀疑的BSD系统上真的有所不同吗?