我在linux中使用flock(2)来控制对自制数据库中资源的访问,同时使用共享和独占锁定模式。我发现如果一个共享锁被授予,那么另一个进程也可以获得共享锁,而不管是否有阻塞的进程在等待排他锁。这意味着对于具有许多重叠读者的流行资源,排他锁请求可能会饿很长时间,也许永远。
这种行为与flock(2) 手册页并不矛盾,但它让我感到惊讶,因为这段代码已经在FreeBSD 和OS-X 中运行了多年,没有出现任何问题。我的猜测是 BSD 系统必须实现某种队列来防止独占锁永远饿死。
我的主要问题是,是否有任何简单的技巧或编程模式可以防止我的独占锁挨饿?
第二个问题,为了满足我的好奇心,有没有人知道这在 BSD 系统上是否真的像我怀疑的那样不同?