|
|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Konstantin Tokar 2:5020/400 30 Jan 2003 13:00:58 To : Alexander Ponomarenko Subject : Re: Counter --------------------------------------------------------------------------------
> KT> Гонки. Задай в гугле поиск по 'race condition гонки' - получишь
> KT> подробный ответ. Проблема простая - твой алгоритм неправильный. Hадо
> KT> 1) заблокировать файл
> KT> 2) прочитать
> KT> 3) обновить
> KT> 4) записать
> KT> 5) разблокировать
> Приведи пример плиз.
> Разве вот так неправильно?
>
> open(Q,"qq");
> flock(Q,LOCK_SH);
> <читаем>
> close(Q);
>
> для записи то же самое, только LOCK_EX.
>
> Если так неправильно, тогда как правильно?
Правильно ты всё пишешь, тебе только надо оставить только один lock,
например (мне такой пример кажется правильным, возможно кто-то меня
поправит?):
open LOCK, 'counter.lock';
flock(LOCK,LOCK_EX);
eval {
open IP, ...
open COUNTER, ...
open PIC, ...
переписать счётчик
close PIC;
close COUNTER;
close IP;
};
flock(LOCK,LOCK_UN);
close LOCK;
Я специяльно заблокировал не тот файл, который читаю.
Вообще, такая схема будет работать не везде, какие-то глюки должны быть
на NFS, но это мелочи. А ещё может проще будет использовать какой-нибудь
mutex.
--- ifmail v.2.15dev5
* Origin: Demos online service (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/127708928679d.html, оценка из 5, голосов 10
|