Может ли Linux flock(fd, LOCK_EX|LOCK_NB) внезапно потерпеть неудачу?

Рассмотрим ситуацию, когда два процесса одновременно пытаются установить монопольную блокировку для некоторого файла, используя flock(fd, LOCK_EX|LOCK_NB),

Как указано, попытки не блокируют, поэтому один из двух процессов должен завершиться с ошибкой EWOULDBLOCK,

Вот мой вопрос: (Linux) реализация flock() гарантировать, что точно один из двух процессов будет успешным в каждом таком случае? Или, возможно, что оба в конечном итоге терпят неудачу с EWOULDBLOCK даже когда никто не вмешивается?

Короче, может flock(fd, LOCK_EX|LOCK_NB) когда-либо неудачно с EWOULDBLOCK ?

В основном меня интересует версия flock() предлагается Linux, но информация о flock() на других системах, таких как OS X, приветствуется.

Кроме того, я предполагаю, что ответ один и тот же, независимо от того, являются ли блокировки исключительными (LOCK_EX) или поделился (LOCK_SH). Если нет, дайте мне знать.

1 ответ

Решение

Чтение мужского стада (2):

EWOULDBLOCK Файл заблокирован, и был выбран флаг LOCK_NB.

Таким образом, получение EWOULDBLOCK означает, что файл уже заблокирован. Если гарантируется, что ваши два процесса являются единственными вовлеченными, они никогда не получат EWOULDBLOCK для одного и того же файла в одно и то же время.

Обратите внимание, что темы это другая история. Потоки обычно совместно используют файловые дескрипторы, поэтому несколько потоков в одном и том же процессе могут успешно вызывать flock() для одного и того же файла.

Другие вопросы по тегам