Cyril Slobin ([info]slobin) wrote,
@ 2008-05-09 18:43:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:citaĵoj

«Ролевая игра -- это трансляция can персонажа в may игрока».

Позже я постараюсь развить тему. Этот пост -- что-то вроде анонса или заявки на участок.

... На палатку падали чипы холода ...



(Post a new comment)


[info]faceted_jacinth
2008-05-09 09:03 pm UTC (link)
Оффтоп:
Я тут с одной проблемкой программистской столкнулся, но постить её как-то стрёмно, вдруг у неё на самом деле есть простое решение. Вот, прощупаю почву!

Как решить следующую проблему межпроцессной (межтредовой на самом деле) синхронизации: есть некий Ресурс, у него есть Хозяин и некоторое количество претендующих Рабов, Хозяин всё время работает с ресурсом сам, но иногда даёт одному рабу (ровно одному ровно один раз!) возможнсть с ним поработать?

Есть достаточно простой вариант, когда рабы пихают лямбды, которые всё и делают, в синхронизированную очередь, а хозяин их по одной достаёт и исполняет. Тогда всё получается достаточно просто и математически надёжно, то есть между любыми двумя инструкциями можно вставить переключение тредов или какой-нибудь Thread.Interrupt (выводящий цель из Wait, если она в нём, и выкидывающийся в ней соответствующий эксепшен), и всё будет работать как часы всё равно. На всякий случай, семантика там именно такая должна быть:

MasterThread:
while (true)
{
//Do Something
// ...
lock(queue)
{
if (queue.Count > 0)
{
var command = queue.Dequeue();
command.Executor();
command.Completed.Set(); // типа взводим семафор в единичку как бы
// Do something more after the command execution
// ...
}
}
// Do something unrelated
}

SlaveFunc:
var completed = new AutoResetEvent(false);
var result = "";
lock (queue)
{
queue.Add(new Command(completed, delegate
{
// Do computations
result = "Computations' result"
}))
}
completed.WaitOne();
return result;


Воот, как-то так. Практически непробиваемо, за исключением случаев, когда передаваемый метод содержит злые сайд-эффекты, а completed.WaitOne() выбивается интерраптом или по таймауту, например.

Но появляется резонный вопрос: а можно ли это сделать чисто при помощи обычных синхронизационных примитивов, без перекидывания лямбды и исполнения её на стороне мастера? Ну, чтобы слейв просто заблокировался, пока мастер не разрешит исполнится, мастер заблокировался до завершения исполнения этого конкретного слейва и всё продолжилось дальше?

У меня не получается что-то =( Я уж даже начал подозревать, что, может быть, это в принципе нерешаемая задача, так, как я её ставлю...

(Reply to this)(Thread)


[info]slobin
2008-05-10 02:34 pm UTC (link)
Я, к сожалению, вообще не знаю, как сегодня программируют параллелизм. Мои знания остались на уровне Дейкстры, Хоара и языков Ада и Оккам. Я намереваюсь поступить с этим так же, как с объектной ориентированностью -- переждать, когда эта чума пройдёт. ;-)

... Преобразователь магазина в очередь ...

(Reply to this)(Parent)(Thread)


[info]faceted_jacinth
2008-05-10 02:36 pm UTC (link)
Эх, ну ладно, буду сам ещё думать немножко.

(Reply to this)(Parent)


Create an Account
Forgot your login?
Login w/ OpenID
English • Español • Deutsch • Русский…