Поскольку PHP-скрипты не являются многопоточными, я не считаю, что критические секции имеют значение. Я согласен с тем, что у вас есть состояние гонки, потому что несколько экземпляров выполняются параллельно, но критическая секция не решит вашу проблему.
Если вы используете обработчик сеанса на основе файлов, вы можете попробовать базовый flock()
. Если вы используете базу данных, вы можете попробовать использовать собственный механизм блокировки (предпочтительно на уровне строк). Если вы используете memcached, вы можете попробовать реализовать распределенную систему блокировки.
Вы не захотите применять блокировку слишком широко. Вам нужно что-то максимально детализированное (возможно, привязанное к идентификатору сеанса). Если вы попытаетесь сериализовать все поведение сеанса, вы создадите серьезное узкое место.
В мире баз данных (и в других местах) оптимистичные «замки» — это часто все, что вам нужно. Они включают простой счетчик, который увеличивается. Если счетчик выключен (коллизия), запись не обновляется, и вы можете повторно получить и применить свои различия по мере необходимости. Это вещь типа UPDATE table WHERE count = lastcount
в сочетании с повторной попыткой. Это часто помогает.
Конечно, вы можете использовать блокировку файлов, семафоры SYSV (экономно) и множество других методов для достижения этой цели. Просто помните, это звучит как состояние гонки, но это не имеет ничего общего с потоками.
person
pestilence669
schedule
05.04.2010