Как уберечь linux flock (2) от лишних запросов на эксклюзивные блокировки?

#linux #linux-kernel #freebsd #flock

#linux #linux-ядро #freebsd #flock

Вопрос:

Я использую flock (2) в Linux для управления доступом к ресурсам в домотканой базе данных, используя как общие, так и эксклюзивные режимы блокировки. Я обнаружил, что если предоставляется общая блокировка, то другой процесс также может получить общую блокировку, независимо от того, есть ли заблокированные процессы, ожидающие эксклюзивных блокировок. Это означает, что для популярного ресурса со многими перекрывающимися читателями запрос на эксклюзивные блокировки может голодать долгое время, возможно, навсегда.

Такое поведение не противоречит справочной странице flock (2), но меня это удивляет, потому что этот код годами работал во FreeBSD и OS-X без проблем. Я предполагаю, что системы BSD должны реализовать какую-то очередь, чтобы предотвратить вечное голодание эксклюзивных блокировок.

Мой основной вопрос: есть ли какой-нибудь простой трюк или шаблон программирования, чтобы мои эксклюзивные блокировки не голодали?

Вторичный вопрос, чтобы удовлетворить мое любопытство, кто-нибудь знает, действительно ли это отличается от систем BSD, как я подозреваю?

Комментарии:

1. flock напоминает мне караваны блокировок.

Ответ №1:

У меня была точно такая же проблема во FreeBSD 7.2, и я не нашел способа предотвратить истощение записи в flock (). Вы должны выбрать другой метод блокировки, например, SysV IPC или простой файл с флажком остановки.