TLENS » 2013.06.05 21:37

1) Задача - есть класс "А" и куча обьектов этого класса. Каждый обьект хранится в memcache сервере. В каждого обьекта есть переменная типа булеан (работающий/приостановлен) нам нужно постоянно использовать обьект под номером 1 пока не придется его заблокировать после мы переключаемся на обьект номер 2 и работаем через него.
Решение 1:
    Пишем в память переменную хранящую номер активного обьекта и в случае блокировки первого мы делаем инкремент этого поля.
Проблема 1:
    Если с объектом работает одновременно несколько потоков может быть непредвиденное поведение программы например многократный инкремент так как допустим в 5 потоков загрузится первый обьект и 5 раз сработает блок что приведет к увеличению переменной с номером работающего обьекта на 5 раз а в теории нам надо всего то одно увеличения.
Решение 2:
    В каждом обьекте хранить последнее время успешного использования и время последней блокировки и каждый раз перебирать все обьекты вычисляя тот который давнее всех был заблокирован.
Проблема 2:
    Эта задача будет выполнятся десятки а то и сотни раз в секунду да и обьектов может быть сотни а то и больше. И каждый раз сгружать их в память для перебора не выход.
Это все не то. Что вы можете посоветовать для поочередного использования обьектов в многопоточной среде?

Gemorroj » 2013.06.05 22:23

как реализована многопоточность?

TLENS » 2013.06.05 22:29

Обычный php скрипт запускаемый одновременно несколько раз обращаются к одной переменной которая хранится в мемкеше

Gemorroj » 2013.06.05 23:34

TLENS, ну не храни ее в мемкеше)

TLENS » 2013.06.06 12:37

А где тогда? в файле? Какая разница?

Gemorroj » 2013.06.06 16:23

прочитал еще раз.
так а если инкрементить и блочить ДО использования объекта. т.е. каждому инстансу будет выдан новый объект.

TLENS » 2013.06.06 20:50

В том то и дело что нужно что бы все использовать только один объект.

tipsun » 2013.06.13 21:40

Может быть нужно как-то идентифицировать объекты, чтоб определенный номер объекта + 1.
Даже если одновременно используются, то получится не + 1, а именно текущий номер объекта + 1.
Извиняюсь, если чушь.