Как уберечь linux flock(2) от голодающих запросов на эксклюзивную блокировку?
Я использую flock(2) в linux для управления доступом к ресурсам в базе данных homespun, используя как общий, так и эксклюзивный режимы блокировки. Я считаю, что если предоставляется общая блокировка, то другой процесс также может получить общую блокировку, независимо от того, есть ли заблокированные процессы, ожидающие эксклюзивных блокировок. Это означает, что для популярного ресурса со многими перекрывающимися читателями запрос на эксклюзивную блокировку может голодать в течение длительного времени, возможно, навсегда.
Такое поведение не противоречит man-странице flock(2), но меня удивляет, потому что этот код работал в течение многих лет во FreeBSD и OS-X без проблем. Я предполагаю, что системы BSD должны реализовывать какую-то очередь, чтобы исключить вечные блокировки исключительных блокировок.
Мой основной вопрос: есть ли какой-нибудь простой трюк или шаблон программирования, чтобы мои эксклюзивные замки не умирали от голода?
Вторичный вопрос, чтобы удовлетворить мое любопытство, кто-нибудь знает, действительно ли это отличается от систем BSD, как я подозреваю?
1 ответ
У меня была точно такая же проблема во FreeBSD 7.2, и я не нашел способа предотвратить голодание писателя в flock(). Вы должны выбрать другой метод блокировки, например, SysV IPC или простой файл метки остановки.