LINUX.ORG.RU

[PERL] Синхронизация процессов

 


0

0

Есть несколько процессов, запущенных одновременно, и стоит задача обеспечить выполнение одной процедуры только одним процессом в любой момент времени.

Сейчас это реализовано путем экслюзивного flock() в начале процедуры, и его снятием в конце.

Работает как надо, но есть проблема - когда "ждут" несколько потоков, то при его отпускании почему-то лок отдается последнему процессу который стал в очередь на этот лок, а хочется организовать здоровую очередь (т.е. первым стал в очередь, первым получил лок). В случае с fork я бы использовал Thread::Queue, а есть ли красивые методы решения этой проблемы, или прийдется писать свои костыли?


Похоже, кому достаётся блокировка - зависит от ОС... Можно попробовать файловые блокировки в стиле POSIX (через fcntl) и XSI-семафоры (semget). Ну или городить свои костыли.

const86 ★★★★★
()
Ответ на: комментарий от const86

semget тоже полностью от OS зависит. Прийдется делать какую-то shared очередь меж-процессную, и ей уже пользоваться. Можно сделать отдельный процесс - lock daemon, с простым IPC через сокеты. Процесс принимает в порядке поступления "заказы", и по мере освобождения локов - отдает его следующему, о чем через сокет радостно верещит. Когда процессу лок не нужен, он либо сокет закрывает либо пишет "свободно", и закрывает сокет (можно и просто первое, будет надежнее в плане крешей скрипта)

vnovouhov
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.