Re[19]: Активные объекты в С++
От: vdimas Россия  
Дата: 23.03.05 19:39
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>На самом деле, вопрос получился глубоко филосовским по одной причине — не оговорено точное определение примитива синхронизации.


Его можно определить только в контексте конкретной реализации. Скажем, хендл мютекса.
Re[11]: Активные объекты в С++
От: Cyberax Марс  
Дата: 24.03.05 07:39
Оценка: +1
Gaperton пишет:

> Вы на Эрланге хоть что-нибудь писали? Если бы писали, или хотя-бы

> интересовались, то знали бы, что "разделяемый ресурс" просто-напросто
> заворачивают в процесс . *Не нужны *там мьютексы, барьеры и семафоры и
> прочее удаление гланд через задний проход. *Не думает *эрланговский
> программист о синхронизации — нет у него таких проблем. Нет
> синхронизации — нет и примитивов синхронизации. А все остальное, как
> любил говорить мне уважаемый Трурль , существует только в вашем сознании.

Вообще-то эрланговским программистам тоже приходится думать о
синхронизации, хотя это и намного легче делать.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[11]: Активные объекты в С++
От: Cyberax Марс  
Дата: 24.03.05 07:41
Оценка:
Сергей Губанов пишет:

> RRM>Хочется заметить, что из того, что лежит на чаше "сущностей

> низкоуровневой реализации" всегда можно сделать то, что лежит на
> другой чаще.
> И наоборот.
> *Synchonization Examples*
> # Readers and Writers
> # Signals
> # Re-entrant Locks
> # Binary and Generic Semaphores
> # Barrier
> # Bounded Buffer
> http://bluebottle.ethz.ch/languagereport/node8.html
> Что первично: курица или яйцо?

Покажите цепную блокировку
(http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/Lock.html)
на AWAITах, пожалуйста.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[12]: Активные объекты в С++
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 24.03.05 08:43
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Покажите цепную блокировку

C>(http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/Lock.html)
C>на AWAITах, пожалуйста.

Нужную Вам блокировку делает не AWAIT, а следующий код:
  ...
  BEGIN{EXCLUSIVE}
    ...
  END
  ...

причем блокировке подвергается доступ к данному объекту. Я же ранее упоминал, что, например, на C# аналогичный код выглядит вот так:
  ...
  lock(this)
  {
    ...
  }
  ...

что, как известно, в точности эквивалентно коду (без "синтаксического сахара"):
  ...
  System.Threading.Monitor.Enter(this);
  try
  {
    ...
  }
  finally
  {
    System.Threading.Monitor.Exit(this);
  }

В согласии с ООП любой (внешний) ресурс в программе представляется неким объектом. Доступ к данным объекта осуществляется посредством вызовов его методов, причем внутри этих методов в нужных местах наставлены блоки BEGIN{EXCLUSIVE} ... END. Если нужно получить доступ сразу к нескольким (внешним) ресурсам, то надо соорудить один (единый) объект предоставляющий этот доступ (эти русурсы есть его private поля) (блокировке будет подвергаться он один целиком и сразу). Вот и все.
Re[13]: Активные объекты в С++
От: Cyberax Марс  
Дата: 24.03.05 09:08
Оценка:
Сергей Губанов пишет:

> C>Покажите цепную блокировку

> C>(http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/Lock.html)
>
> C>на AWAITах, пожалуйста.
> Нужную Вам блокировку делает не *AWAIT*, а следующий код:
>
> ...
> BEGIN{EXCLUSIVE}
> ...
> END
> ...
>
>
Нет, не даст. Мне нужно примерно такое:
BEGIN{EXCLUSIVE} //1

BEGIN{EXCLUSIVE} //2
END//1

END//2

То есть разблокирование должно производится _в_ _обратном_ порядке,
относительно взятия блокировок. Это нужно для орагнизации lock-free списков:
1. Блокируем текущее звено
2. Изменяем его.
3. Блокируем следующее звено, не бросая блокировку текущего звена.
4. Делаем текущим следующее звено (уже заблокированное).
5. Бросаем блокировку старого звена.

[идеология skipped]

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[14]: Активные объекты в С++
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 24.03.05 10:06
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Нет, не даст. Мне нужно примерно такое:

C>
C>BEGIN{EXCLUSIVE} //1

C>BEGIN{EXCLUSIVE} //2
C>END//1

C>END//2
C>

C>То есть разблокирование должно производится _в_ _обратном_ порядке,
C>относительно взятия блокировок. Это нужно для орагнизации lock-free списков:
C>1. Блокируем текущее звено
C>2. Изменяем его.
C>3. Блокируем следующее звено, не бросая блокировку текущего звена.
C>4. Делаем текущим следующее звено (уже заблокированное).
C>5. Бросаем блокировку старого звена.


  ...
  a.semaphore.P();
  ...
  b.semaphore.P();
  ...
  a.semaphore.V();
  ...
  b.semaphore.V();
  ...

Там есть пример реализации семафора:
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;
Re[12]: Активные объекты в С++
От: Gaperton http://gaperton.livejournal.com
Дата: 25.03.05 12:56
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Вообще-то эрланговским программистам тоже приходится думать о

C>синхронизации, хотя это и намного легче делать.

Да, согласен, мы это уже обсудили с "А почему вы спрашиваете"
http://www.rsdn.ru/Forum/Message.aspx?mid=1086943&only=1
Автор: Gaperton
Дата: 23.03.05

С тем, что "вообще не нужно", я погорячился.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.