Я написал CGI-скрипт. Одна из его подпрограмм не может выполняться одновременно. то есть один и тот же пользователь (или хакер) запускает два экземпляра в одно и то же время). Как я могу этого избежать?
Я сделал следующий обходной путь, используя файлы блокировки, но я не уверен, что это безопасно:
unless (-e $filelock) {
sub_that_should_be_locked();
}
sub sub_that_should_be_locked {
open FILE, ">", $filelock;
flock DATAFILE, LOCK_EX;
close FILE;
...Code that cannot be executed at the same time...
...Code that cannot be executed at the same time...
unlink $filelock;
}
Не должно быть ожидания/очереди, параллельные процессы никогда не должны вызывать sub_that_should_be_locked
unless
одновременно, то оба будут успешно продолжать работу, исходя из неверного предположения, что они являются единственной запущенной копией. - person Phylogenesis   schedule 22.04.2015sub_that_should_be_locked
. Это правильно? - person Borodin   schedule 22.04.2015sub_that_should_be_locked
или второй процесс должен дождаться выхода первого процесса изsub_that_should_be_locked
? - person ikegami   schedule 22.04.2015sub_that_should_be_locked
, потому что доля секунды тоже может вызвать проблемы, так как баланс может обновляться не так быстро - person user3518089   schedule 22.04.2015sub_that_should_be_locked
, но я сомневаюсь, что вы этого хотите. При каких обстоятельствах следует вызывать подпрограмму? - person Borodin   schedule 22.04.2015