Если есть несколько процессов, ожидающих эксклюзивной блокировки, не указано, какой из них преуспеет в ее получении первым. Не полагайтесь на какой-либо конкретный заказ.
Сказав это, текущий код ядра разбудит их в порядке их блокировки. Этот комментарий в fs/locks.c
:
/* Insert waiter into blocker's block list.
* We use a circular list so that processes can be easily woken up in
* the order they blocked. The documentation doesn't require this but
* it seems like the reasonable thing to do.
*/
Если вы хотите, чтобы набор процессов выполнялся по порядку, не используйте flock()
. Использовать семафоры SysV (semget()
/ semop()
).
Создайте набор семафоров, который содержит один семафор для каждого процесса после первого, и инициализируйте их все в -1. Для каждого процесса после первого выполните semop()
на семафоре этого процесса со значением sem_op
, равным нулю - это заблокирует его. После завершения первого процесса он должен сделать semop()
на семафоре второго процесса со значением sem_op
, равным 1 - это вызовет пробуждение второго процесса. После завершения второго процесса он должен выполнить semop()
для семафора третьего процесса со значением sem_op
, равным 1, и т. Д.