Здравствуйте, Gaperton, Вы писали:
G>На самом деле, вопрос получился глубоко филосовским по одной причине — не оговорено точное определение примитива синхронизации.
Его можно определить только в контексте конкретной реализации. Скажем, хендл мютекса.
Gaperton пишет:
> Вы на Эрланге хоть что-нибудь писали? Если бы писали, или хотя-бы > интересовались, то знали бы, что "разделяемый ресурс" просто-напросто > заворачивают в процесс . *Не нужны *там мьютексы, барьеры и семафоры и > прочее удаление гланд через задний проход. *Не думает *эрланговский > программист о синхронизации — нет у него таких проблем. Нет > синхронизации — нет и примитивов синхронизации. А все остальное, как > любил говорить мне уважаемый Трурль , существует только в вашем сознании.
Вообще-то эрланговским программистам тоже приходится думать о
синхронизации, хотя это и намного легче делать.
Сергей Губанов пишет:
> RRM>Хочется заметить, что из того, что лежит на чаше "сущностей > низкоуровневой реализации" всегда можно сделать то, что лежит на > другой чаще. > И наоборот. > *Synchonization Examples* > # Readers and Writers > # Signals > # Re-entrant Locks > # Binary and Generic Semaphores > # Barrier > # Bounded Buffer > http://bluebottle.ethz.ch/languagereport/node8.html > Что первично: курица или яйцо?
В согласии с ООП любой (внешний) ресурс в программе представляется неким объектом. Доступ к данным объекта осуществляется посредством вызовов его методов, причем внутри этих методов в нужных местах наставлены блоки BEGIN{EXCLUSIVE} ... END. Если нужно получить доступ сразу к нескольким (внешним) ресурсам, то надо соорудить один (единый) объект предоставляющий этот доступ (эти русурсы есть его private поля) (блокировке будет подвергаться он один целиком и сразу). Вот и все.
Сергей Губанов пишет:
> C>Покажите цепную блокировку > C>(http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/Lock.html) > > C>на AWAITах, пожалуйста. > Нужную Вам блокировку делает не *AWAIT*, а следующий код: > > ... > BEGIN{EXCLUSIVE} > ... > END > ... > >
Нет, не даст. Мне нужно примерно такое:
То есть разблокирование должно производится _в_ _обратном_ порядке,
относительно взятия блокировок. Это нужно для орагнизации lock-free списков:
1. Блокируем текущее звено
2. Изменяем его.
3. Блокируем следующее звено, не бросая блокировку текущего звена.
4. Делаем текущим следующее звено (уже заблокированное).
5. Бросаем блокировку старого звена.
C>То есть разблокирование должно производится _в_ _обратном_ порядке, C>относительно взятия блокировок. Это нужно для орагнизации lock-free списков: C>1. Блокируем текущее звено C>2. Изменяем его. C>3. Блокируем следующее звено, не бросая блокировку текущего звена. C>4. Делаем текущим следующее звено (уже заблокированное). C>5. Бросаем блокировку старого звена.
TYPE
Sem* = OBJECT(* Binary Semaphore *)VAR taken: BOOLEAN
PROCEDURE P*; (* Enter semaphore *)BEGIN{EXCLUSIVE}
AWAIT(~taken); taken := TRUE
END P;
PROCEDURE V*; (* Leave semaphore *)BEGIN{EXCLUSIVE}
taken := FALSE
END V;
PROCEDURE & Init;
BEGIN taken := FALSE
END Init;
END Sem;