Активные объекты в С++
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 21.03.05 10:17
Оценка: -1
Статья:
Активные объекты в С++
Библиотека эмуляции активных объектов на С++ в духе Active Oberon.

Автор:
Владимир Лось

Оглавление

0. Пара слов вначале
1. Откуда ноги растут
2. Активные объекты
3. Исключительный доступ
4. Возвращение после отвлечения
5. Куда путь держим?...
6. Что относительно библиотеки?
Приложение 1
Приложение 2
Приложение 3


0. Пара слов вначале

Итак, господа и дамы, по прошествии стольких лет, сломанных копий и пустопорожних обсуждений в Сети, я таки сподобился засесть и накропать нечто, что будет очень похоже (я надеюсь) на реализацию активных объектов а ля Активный Оберон.

К моему удивлению, сделать это оказалось довольно легко. Нет, в «кишки» GCC я не полез – упоси, Господь! – пусть этим занимается, кто поумней и посвободней... :о) Легкость реализации , по-видимому, объясняется несколькими причинами. 1) знанием предмета (чего хотелось получить); 2) как оказалось (к немалому удивлению автора), не плохому знанию С/С++ и 3) желанием, наконец, дать «в народ» некий инструмент, позволяющий получить семантику Активного Оберона в более привычной, языковой и исполнительной среде. Сюда ещё стоит приплюсовать планы автора на конкретном примере «въехать», наконец, «плотненько» и, по-возможности, навсегда в POSIX-системы. Кроме того, не последнюю роль сыграла и, просто-таки гениальность спецификаций POSIX, после ознакомления и овладевания навыками работы с которыми, навряд ли кто из ПРОГРАММИСТОВ захочет возвращаться в Win32. Добавьте сюда ещё и то интеллектуальное и эстетическое удовольствие, которое получаешь, работая с ХОРОШИМИ продуктами (а ОСРВ QNX несомненно к таким относится!), и Вы поймёте, чем для меня были эти три недели работы над библиотекой, предоставляемой на ваш суд... Насколько эти все усилия и желания увенчались успехом – оценивать тебе, уважаемое сообщество... :о)

Хочу от всей души поблагодарить Евгения Зуева, Томаса Фрея и Патрика Реали, которые предоставляли материалы и консультации по Активному Оберону и Зоннону (следующей «тихой революции» из ETHZ), Егору Горошко (Draggan), за участие в конструктивных дискуссиях и всему харьковскому сообществу кьюниксоидов (http://qnxclub.net) – за то, что выдерживали мой корявый язык во время всех тех пародий на доклады и выступления по поводу активных объектов!

Ну, шо ж... «помоляся на восток», начнём пожалуй!

Re: Активные объекты в С++
От: Cyberax Марс  
Дата: 21.03.05 10:39
Оценка:
Сергей Губанов пишет:

> *Статья:*

> Активные объекты в С++ <http://qnxclub.net/files/articles/ao/ao.html&gt;
> Библиотека эмуляции активных объектов на *С++* в духе *Active Oberon*.

Зверско... Не говоря уж о том, что неэффективно и непрактично.
Boost.Threads поудобнее будет:
http://www.boost.org/doc/html/threads.html В частности, вместо Await
есть http://www.boost.org/doc/html/condition.html

А если уж совсем кровожадно, то ACE:
http://www.cs.wustl.edu/~schmidt/ACE.html

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re: Активные объекты в С++
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 21.03.05 11:00
Оценка: 4 (3)
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Статья:

СГ>Активные объекты в С++
СГ>Библиотека эмуляции активных объектов на С++ в духе Active Oberon.

СГ>Автор:

СГ>Владимир Лось

Не чувак внатуре крут. Знание Семёна Альтова и КВН у него точно на высоте...
Вот только я не понял одного, он там в 2-ой главе ставит вопрос: "Что такое активные объекты?"
и даёт 2 неправильных ответа, а где правильный-то?

Назвался груздем — полезай в кузов.

(Русская народная пословица)

Да и избранный стиль повествования меня как-то уж очень напряг, дальше 3-ей главы вдумчиво прочитать мне не удалось... Все эти лирические отступления как-то уж очень сбивают..

Простите, кто на ком стоял? Выражайтесь яснее!

(Булгаков, Собачье сердце.)

Да специально для тех, кто тоже из этой статьи так и не понял, что такое активные объекты. Объясняю:
активный объект — это объект обладающий собственным потоком управления, в рамках которого будут исполняться все запросы (синхронные или асинхронные) к данному объекту.
Чтобы не было криков относительно того, откуда вы это взяли и это не совпадает с понятием активных объектов из оберона. Отвечаю — это классическое определение активного объекта, взятое мной из книги Энтони Элиенса "Объектно-ориентированное программирование".
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re: Активные объекты в С++
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.03.05 12:03
Оценка: +1
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Статья:

СГ>Активные объекты в С++
СГ>Библиотека эмуляции активных объектов на С++ в духе Active Oberon.

СГ>Автор:

СГ>Владимир Лось

О стиле данной статьи лучше вообще не говорить, т.к. мне он помешал вдумчиво прочитать ее. Все чего смог -- это просмотреть по диагонали.

А вот эта фраза:

Наиболее краткое пояснение, о чём идёт речь, выглядит так: потоки, процессы, мьютексы и прочая требуха – не уровень аналитика предметной области, проектировщика архитектуры и разработчика объектов программной системы. Это – даже не уровень программиста, реализующего проектные решения, принятые на более ранних этапах. Это – слова не из словаря этих специалистов. Привлечение этих понятий происходит вынужденно. Это – «чужеродные тела» в программных системах.

сразу же отбила желание читать дальше. Если уж архитектор (проектировщик) не должен думать о том, будет ли приложение работать в виде одного многопоточного процесса или множества однопоточных процессов, то... Хотя бы узнать о каких задачах тогда вообще идет речь. Хотя на примерах.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: Активные объекты в С++
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 21.03.05 12:08
Оценка: +1 :))) :)
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, Сергей Губанов, Вы писали:


E>О стиле данной статьи лучше вообще не говорить, т.к. мне он помешал вдумчиво прочитать ее. Все чего смог -- это просмотреть по диагонали.


Аналогично... До 3-ей главы кое-как прочёл, но потом иссяк...

E>Если уж архитектор (проектировщик) не должен думать о том, будет ли приложение работать в виде одного многопоточного процесса или множества однопоточных процессов, то... Хотя бы узнать о каких задачах тогда вообще идет речь. Хотя на примерах.


Вот о таких наверное:
while(true)
{
    ThinkAbout(SphericalHorse* horses);
}


Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[2]: Активные объекты в С++
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 21.03.05 12:42
Оценка:
Здравствуйте, Mr. None, Вы писали:

MN>Вот только я не понял одного, он там в 2-ой главе ставит вопрос: "Что такое активные объекты?"

MN>и даёт 2 неправильных ответа, а где правильный-то?

Это понятие объясняется в дальнейших главах, хотя конкретного определения самого термина не дается.

MN>Да специально для тех, кто тоже из этой статьи так и не понял, что такое активные объекты. Объясняю:

MN>активный объект — это объект обладающий собственным потоком управления, в рамках которого будут исполняться все запросы (синхронные или асинхронные) к данному объекту.
MN>Чтобы не было криков относительно того, откуда вы это взяли и это не совпадает с понятием активных объектов из оберона. Отвечаю — это классическое определение активного объекта, взятое мной из книги Энтони Элиенса "Объектно-ориентированное программирование".

Можно выполнять запросы в потоке выполнения запрашиваемого объекта, а можно и в исходном потоке запрашивающего объекта. Можно так, а можно сяк. С какой стати это дело вдруг имеет отношение к определению активного объекта?

Активный объект — это носитель активности (потока исполнения) и носитель данных (в том числе и эксклюзивных) причем синхронизация активностей осуществляется способом описываемым ниже. Доступ к эксклюзивным данным можно получить только с помощью методов этого объекта и никак иначе. Вся-перевся синхронизация активностей организуется только лишь внутри методов объекта изменяющих/читающих данные. Все-перевсе условия синхронизации сводятся всего лишь к трем пунктам:
  • Борьба за эксклюзивный доступ к данным.
  • Ожидание выполнения какого-то условия.
  • Ожидание процессорного времени (недоступен для программиста пишущего программу на ЯВУ)

    Борьба за эксклюзивный доступ:
    Active Oberon:
      ...
      BEGIN{EXCLUSIVE}
        атомарное изменение эксклюзивных данных
      END 
      ...

    C#
      ...
      lock(this)
      {
         атомарное изменение эксклюзивных данных
      }
      ...

    Ожидание выполнения какого-либо условия (обязательно только ВНУТРИ эксклюзивного блока)
    Active Oberon:
      ...
      BEGIN{EXCLUSIVE}
        AWAIT(condition);
        атомарное изменение эксклюзивных данных
      END 
      ...

    C#
      ...
      lock(this)
      {
         while( ! condition) System.Threading.Monitor.Wait(this);
         атомарное изменение эксклюзивных данных
      }
      ...

    Перед входом в эксклюзивный блок данного объекта активности выстраиваются в очередь. Одновременно внутрь эксклюзивного блока данного объекта впускается только одна активность. До тех пор пока впущенная активность из эксклюзивного блока не вышла, остальные активности внутрь эксклюзивных блоков данного объекта не впускаются. Однако активность прорвавшаяся внутрь эксклюзивного блока может обнаружить, что какое-то нужное ей условие condition не выполнено, тогда она засыпает с помощью AWAIT(condition) (или while( ! condition) System.Threading.Monitor.Wait(this); ). Таким образом, внутри эксклюзивных блоков данного объекта теперь нет ни одной живой активности, а значит система впускает внутрь какого-то одного эксклюзивного блока данного объекта следующую активность ранее стоявшую в очереди на вход в эксклюзивный блок. Эта активность завершив свою работу покидает эксклюзивный блок, но в процессе своей работы она могла изменить состояние объекта так, что условие condition = TRUE значит заснувшие в AWAIT активности теперь должны перепроверить свои условия condition и если условие выполняется, то по очереди (по одной) тоже выполниться. Далее все по новой... Стало быть, окончательный вариант на C# имеет следующий вид:
    C#
      ...
      lock(this)
      {
         try
         {
           while( ! condition) System.Threading.Monitor.Wait(this);
           ...
           атомарное изменение эксклюзивных данных
           ...
         } 
         finally
         {
           System.Threading.Monitor.PulseAll(this);
         }
      }
      ...



    Вопрос. Вот интересно, как на C# будет выглядеть аналог такого кода:
    Active Oberon:
      ...
      BEGIN{EXCLUSIVE}
        ...
        атомарное изменение эксклюзивных данных
        ...
        AWAIT(condition1);
        ...
        атомарное изменение эксклюзивных данных
        ...
      END 
      ...

    т.е. атомарное изменение эксклюзивных данных происходит как до, так и после AWAIT?



    Короче говоря, основной смысл активных объектов заключается в том, что на них можно эффективно реализовать иструкцию AWAIT(condition) — это потому, что условие condition надо перепроверять только тогда когда какая-то другая активность покидает какой-либо из эксклюзивных блоков. В другие моменты времени условие AWAIT перепроверять не надо — ведь оно само по себе измениться не может (оно изменяется только с помощью методов объекта в эксклюзивных блоках), так что уснувший поток просто стоит в await очереди и не расходует времени CPU. Я слышал что в Active Object System BlueBottle одновременно нормально живет несколько десятков тысяч активностей (поробуйте, для сравнения, под Windows или под Linux запустить хотя бы десять тысячь потоков!)

    Еще короче: для организации активных объектов используются всего три понятия описанные выше и выражаемые тремя инструкциями EXCLUSIVE, AWAIT и, собственно, ACTIVE. Все остальное — вторично и выводится из этого.
  • Re[2]: Активные объекты в С++
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 21.03.05 12:48
    Оценка: -1 :)
    Здравствуйте, eao197, Вы писали:

    E>сразу же отбила желание читать дальше. Если уж архитектор (проектировщик) не должен думать о том, будет ли приложение работать в виде одного многопоточного процесса или множества однопоточных процессов, то... Хотя бы узнать о каких задачах тогда вообще идет речь. Хотя на примерах.


    В объектно ориентированной операционной системе Aos BlueBottle в отличие от Windows, UNIX, и т.п. нет разбиения на процессы и потоки внутри процессов, там есть всего одна универсальная сущность — активный объект. Так что архитектору и в самом деле нет нужды думать об упомянутых Вами заморочках присущих не ОО системам.
    Re[3]: Активные объекты в С++
    От: Cyberax Марс  
    Дата: 21.03.05 12:55
    Оценка:
    Сергей Губанов пишет:

    > E>сразу же отбила желание читать дальше. Если уж архитектор

    > (проектировщик) не должен думать о том, будет ли приложение работать в
    > виде одного многопоточного процесса или множества однопоточных
    > процессов, то... Хотя бы узнать о каких задачах тогда вообще идет
    > речь. Хотя на примерах.
    > В объектно ориентированной операционной системе Aos BlueBottle
    > <http://bluebottle.ethz.ch/&gt; в отличие от Windows, UNIX, и т.п. нет
    > разбиения на процессы и потоки внутри процессов, там есть всего *одна
    > универсальная сущность — активный объект*.

    Активный объект в AOS — это ОБЫЧНЫЙ поток. Просто вместо потоковой
    функции — объект. ВСЕ, БОЛЬШЕ РАЗНИЦЫ НЕТ!

    --
    С уважением,
    Alex Besogonov (alexy@izh.com)
    Posted via RSDN NNTP Server 1.9
    Sapienti sat!
    Re[3]: Активные объекты в С++
    От: Mr. None Россия http://mrnone.blogspot.com
    Дата: 21.03.05 12:55
    Оценка: +1 :)
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>В объектно ориентированной операционной системе Aos BlueBottle в отличие от Windows, UNIX, и т.п. нет разбиения на процессы и потоки внутри процессов, там есть всего одна универсальная сущность — активный объект. Так что архитектору и в самом деле нет нужды думать об упомянутых Вами заморочках присущих не ОО системам.


    Ну ладно, умолкаем, мы все тут такие не грамОтные академиев не кончали, пишем себе с заморочками присущими не ОО системам. И енти самые ОО системы очевидно только для избранных и понять нам их не дано...
    Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
    Re[3]: Активные объекты в С++
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 21.03.05 13:05
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Здравствуйте, eao197, Вы писали:


    E>>сразу же отбила желание читать дальше. Если уж архитектор (проектировщик) не должен думать о том, будет ли приложение работать в виде одного многопоточного процесса или множества однопоточных процессов, то... Хотя бы узнать о каких задачах тогда вообще идет речь. Хотя на примерах.


    СГ>В объектно ориентированной операционной системе Aos BlueBottle в отличие от Windows, UNIX, и т.п. нет разбиения на процессы и потоки внутри процессов, там есть всего одна универсальная сущность — активный объект. Так что архитектору и в самом деле нет нужды думать об упомянутых Вами заморочках присущих не ОО системам.


    Но ведь в этой системе нельзя программировать на C++. Так зачем же в язык пытаться тащить сущности, которые предназначены не только для другого языка, но и для другой среды исполнения?
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[4]: Активные объекты в С++
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 21.03.05 13:12
    Оценка:
    Здравствуйте, Cyberax, Вы писали:

    C>Активный объект в AOS — это ОБЫЧНЫЙ поток. Просто вместо потоковой

    C>функции — объект. ВСЕ, БОЛЬШЕ РАЗНИЦЫ НЕТ!

    Вы еще скажите что между структурой в языке Си и классом в языке С++ тоже разницы нету. Естественно, что на низком уровне все устроено одинаково, а уж на уровне машинных команд разницы вообще нет. Разница она на более высоком уровне абстракции. Такая сущность как активный объект сводит всю сложную проблему синхронизации процессов+потоков всего лишь к трем понятиям: EXCLUSIVE, AWAIT, ACTIVE, все остальное выводится из них. С другой стороны, эффективно реализовать инструкцию AWAIT в не ОО системе или нереально (большая нагрузка на CPU в бесконечных циклах ожидания на каждый поток) или небезопасно (слишком велика вероятность ошибки программиста приводящих к странным и непонятным зависаниям и т.п. где-то забыл Monitor.PulseAll() написать, где-то лишний раз написал...).
    Re[3]: Активные объекты в С++
    От: Mr. None Россия http://mrnone.blogspot.com
    Дата: 21.03.05 13:12
    Оценка: +2
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Здравствуйте, Mr. None, Вы писали:


    MN>>Вот только я не понял одного, он там в 2-ой главе ставит вопрос: "Что такое активные объекты?"

    MN>>и даёт 2 неправильных ответа, а где правильный-то?

    СГ>Это понятие объясняется в дальнейших главах, хотя конкретного определения самого термина не дается.


    Сударь, вы кажется сам к.ф.-м.н. (или я ошибаюсь) и должны знать, что согласно банальной культуре оформления статей (научных и научно-публицисчтических) если поставил вопрос, ответь на него чётко и ясно, тем более, когда есть обще-принятое определение. А тут, извините, нам рассказали на 2-ух примерах, что не является активным объектом (причём примеры какие-то уж очень вымученные и не реальные) и дальше раздули флейм на несколько страниц с приведением нечитабельных примеров кода... Про стиль изложения я вообще молчу, назвать его можно одним словосочетанием — непрофессиональный стёб.

    MN>>Да специально для тех, кто тоже из этой статьи так и не понял, что такое активные объекты. Объясняю:

    MN>>активный объект — это объект обладающий собственным потоком управления, в рамках которого будут исполняться все запросы (синхронные или асинхронные) к данному объекту.
    MN>>Чтобы не было криков относительно того, откуда вы это взяли и это не совпадает с понятием активных объектов из оберона. Отвечаю — это классическое определение активного объекта, взятое мной из книги Энтони Элиенса "Объектно-ориентированное программирование".

    СГ>Можно выполнять запросы в потоке выполнения запрашиваемого объекта, а можно и в исходном потоке запрашивающего объекта. Можно так, а можно сяк. С какой стати это дело вдруг имеет отношение к определению активного объекта?


    ЦЕНЗУРЕД.ЦЕНЗУРЕД.ЦЕНЗУРЕД.ЦЕНЗУРЕД.ЦЕНЗУРЕД.ЦЕНЗУРЕД.ЦЕНЗУРЕД.ЦЕНЗУРЕД. Да потому что это КЛАССИЧЕСКОЕ КАНОНИЧЕСКОЕ ОПРЕДЕЛЕНИЕ АКТИВНОГО ОБЪЕКТА, взятое из упомянутой мной книги. В этой книге оно появилось из другого источника, ссылка на него там есть — можете проследить до самых корней. Термин никак не связан ни с оберонами, ни с паскалями, ни с г-ном Н. Виртом (я искренне уважаю этого человека, но мне очень ненравится, когда его именем прикрывают непрофессиональный бред). Если нужно, я подниму эту книгу и расскажу вам историю возникновения активных объектов. А откуда вы взяли своё определение активных объектов... Ссылку пожалуйста... Желательно с историческими корнями... Вот пока не приведёте ссылку, давайте вы не будете переливать из пустого в порожнее.

    СГ>Вопрос. Вот интересно, как на C# будет выглядеть аналог такого кода:

    СГ>Active Oberon:
    СГ>
    СГ>  ...
    СГ>  BEGIN{EXCLUSIVE}
    СГ>    ...
    СГ>    атомарное изменение эксклюзивных данных
    СГ>    ...
    СГ>    AWAIT(condition1);
    СГ>    ...
    СГ>    атомарное изменение эксклюзивных данных
    СГ>    ...
    СГ>  END 
    СГ>  ...
    СГ>

    СГ>т.е. атомарное изменение эксклюзивных данных происходит как до, так и после AWAIT?

    То есть думать о заморочках присущих не ОО системам — это не по пацански, а думать о заморочках присущих активным оберонам — это круто... Так что ли?

    Так маленькое замечание — обращение к активному объекту из вне не должно никак отличаться от обращения к обычному объекту... Так что приведённый вами код — это как раз заморочки оберона...
    Реализационно активный объект отличается от обычного наличием внутреннего потока управлений, в котором он выполняет вычисления, читай: активный объект живёт в своём потоке. А все запросы к нему, обычно выполняемые самым обычным для данного языка способом (вызов метода в C++, посылка сообщения в Smalltalk`е), синхронизируются в этот самый поток и в нём выполняются.
    Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
    Re[4]: Активные объекты в С++
    От: Трурль  
    Дата: 21.03.05 13:19
    Оценка:
    Здравствуйте, Cyberax, Вы писали:

    C>Активный объект в AOS — это ОБЫЧНЫЙ поток.


    А почему не "обычный процесс"?
    Re[4]: Активные объекты в С++
    От: Mr. None Россия http://mrnone.blogspot.com
    Дата: 21.03.05 13:21
    Оценка:
    Здравствуйте, Cyberax, Вы писали:

    C>Сергей Губанов пишет:



    C>Активный объект в AOS — это ОБЫЧНЫЙ поток. Просто вместо потоковой

    C>функции — объект. ВСЕ, БОЛЬШЕ РАЗНИЦЫ НЕТ!

    Ну если это так, то это не активный объект и пример г-на Губанова вообще не корректен. Ещё раз определение активного объекта — это объект обладающий собственным потоком управления, в рамках которого будут исполняться все запросы (синхронные или асинхронные) к данному объекту. То есть, активный объект — это не объектная обёртка над потоковой функцией с определённым кодом, а полноценный объект с набором методов, умеющих синхронизировать вызовы этих методов в свой внутренний поток, в котором они будут исполняться... Вот пример простейшего активного объекта:


    // Псевдо-код
    class MySimpleActiveObject
    {
    public:
        MySimpleActiveObject() : _stoped(false)
        {
            _thread = create_thread(&ThreadFunc);
        }
        ~MySimpleActiveObject()
        {
            _stoped = true;
            wait_tread(_thread);
        }
    
        void SomeFunc()
        {
            send_request(_request, SOME_FUNCTION);
        }
    
    private:
        void _SomeFunc()
        {
        }
    
        void ThreadFunc()
        {
            while(!_stoped)
            {
                int reqCode = waite_request(_request);
                switch(reqCode)
                {
                    case SOME_FUNCTION:
                        _SomeFunc();
                    break;
                }
            }
        }
    
        handle _thread;
        handle _request;
        bool _stoped;
    };
    Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
    Re[5]: Активные объекты в С++
    От: Cyberax Марс  
    Дата: 21.03.05 13:24
    Оценка: 40 (2)
    Сергей Губанов пишет:

    > C>Активный объект в AOS — это ОБЫЧНЫЙ поток. Просто вместо потоковой

    > C>функции — объект. ВСЕ, БОЛЬШЕ РАЗНИЦЫ НЕТ!
    > Вы еще скажите что между структурой в языке Си и классом в языке С++
    > тоже разницы нету.

    Представьте себе, сейчас в fido7.ru.cpp был флейм на эту тему. Я привел
    в нем пример паттерна visitor, написанного на обычном С.
    http://groups-beta.google.com/group/fido7.ru.cpp/msg/f7b6c66625376378

    > Такая сущность как активный объект сводит всю сложную проблему

    > синхронизации процессов+потоков всего лишь к трем понятиям:
    > *EXCLUSIVE*, *AWAIT*, *ACTIVE*, все остальное выводится из них.

    Exclusive == mutex.
    Await == monitor with condition.
    active == thread.

    > С другой стороны, эффективно реализовать инструкцию *AWAIT* в не ОО

    > системе или нереально (большая нагрузка на CPU в бесконечных циклах
    > ожидания на каждый поток) или небезопасно (слишком велика вероятность
    > ошибки программиста приводящих к странным и непонятным зависаниям и
    > т.п. где-то забыл Monitor.PulseAll() написать, где-то лишний раз
    > написал...).

    Объясняю: в Обероне AWAIT кривой и косой. Выражение в AWAIT не должно
    иметь побочных эффектов (а это сразу отметает использование в нем
    функций), плюс должна быть возможность отследить его транзитивное
    замыкание. Императивные языки (в том числе и Оберон) этого сделать НЕ
    позволяют, так что AWAIT в них реализуется как простенький
    синтаксический сахар над обычными мониторами. Поэтому об "эффективном
    использовании AWAIT в Обероне" лучше бы молчали.

    Функциональные языки со ссылочной целостностью как раз ПОЗВОЛЯЮТ
    реализовать AWAIT в полном объеме и эффективно. В том же MLе есть
    действительно прозрачная многозадачность:
    http://portal.acm.org/citation.cfm?id=866513

    Есть и практическая реально используемая реализация: Erlang.

    --
    С уважением,
    Alex Besogonov (alexy@izh.com)
    Posted via RSDN NNTP Server 1.9
    Sapienti sat!
    Re[5]: Активные объекты в С++
    От: Privalov  
    Дата: 21.03.05 13:36
    Оценка:
    Здравствуйте, Трурль, Вы писали:

    C>>Активный объект в AOS — это ОБЫЧНЫЙ поток.


    Т>А почему не "обычный процесс"?


    Потому что в системах типа Windows процесс содержит не менее одного потока. В последней Обероновой войне, где речь шла о защите памяти, можно найти подробности. Вкратце — все активные объекты Оберона выполняются в общем адресном пространстве, т. е. в терминологии Windows это — потоки.
    Re[5]: Активные объекты в С++
    От: Cyberax Марс  
    Дата: 21.03.05 13:49
    Оценка:
    Mr. None пишет:

    > C>*Активный объект в AOS* — это ОБЫЧНЫЙ поток. Просто вместо потоковой

    > C>функции — объект. ВСЕ, БОЛЬШЕ РАЗНИЦЫ НЕТ!
    >
    > Ну если это так, то это не активный объект и пример г-на Губанова
    > вообще не корректен.

    Выделено.

    > Ещё раз определение активного объекта — это объект обладающий

    > собственным потоком управления, в рамках которого будут исполняться
    > все запросы (синхронные или асинхронные) к данному объекту. То есть,
    > активный объект — это не объектная обёртка над потоковой функцией с
    > определённым кодом, а полноценный объект с набором методов, умеющих
    > синхронизировать вызовы этих методов в свой внутренний поток, в
    > котором они будут исполняться...

    Я знаю. А еще лучше в качестве активных объектов приводить в пример
    COM-объекты в апартаментах.

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

    MN>...согласно банальной культуре оформления статей...


    Так, на всякий случай замечу, что это претензии, вообще-то, к автору статьи, а не ко мне.

    MN> Вот пока не приведёте ссылку, давайте вы не будете переливать из пустого в порожнее.


    Вот активные объекты, не из книжки вычитанные, а уже реализованные настоящие живые: http://bluebottle.ethz.ch/
    А вот, собственно, и сам автор Prof. Dr. Jurg Gutknecht (автор языка Active Oberon, соавтор нескольких ОО операционных систем, руководитель группы Programming Languages and Runtime Systems Research Group в ETH) http://www.inf.ethz.ch/personal/gutknech/ у него на странице есть ссылки на соотвествующую литературу (правда некоторые по немецки).

    MN>Реализационно активный объект отличается от обычного наличием внутреннего потока управлений, в котором он выполняет вычисления, читай: активный объект живёт в своём потоке. А все запросы к нему, обычно выполняемые самым обычным для данного языка способом (вызов метода в C++, посылка сообщения в Smalltalk`е), синхронизируются в этот самый поток и в нём выполняются.


    Zonnon активности именно так и устроены: активные объекты могут вести диалог по заранее описанному в EBNF форме протоколу — каждый из них находится в своем потоке, а посланные ему сообщения ставятся в очередь. Только кроме этого, дополнительно, можно исполнять методы объекта как обычно — в потоке вызвавшем этот метод, а когда выполнение дойдет до EXCLUSIVE блока (если дойдет), то тут уже сложно сказать где чей поток, так как внутри EXCLUSIVE блока одновременно может находится только один поток, а какой он — вызвавший, вызываемый или третий специальный... это уже не так важно.
    Re[5]: Активные объекты в С++
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 21.03.05 14:47
    Оценка: -3
    Здравствуйте, Mr. None, Вы писали:

    MN>...Ещё раз определение активного объекта — это объект обладающий собственным потоком управления, в рамках которого будут исполняться все запросы (синхронные или асинхронные) к данному объекту...


    Да с какой стати все-то? Не все, а некоторые. Есть же целое семейство запросов не нуждающихся в синхронизации вообще (не имеющих EXCLUSIVE блока). Например методы навроде:
    int GetValue()
    {
      return this.privateValue;
    }

    уж точно не нуждаются в синхронизации и могут исполняться непосредственно в вызывающем потоке параллельно с остальными потоками не вызывая накладных расходов на блокировку.
    Re[6]: Активные объекты в С++
    От: Трурль  
    Дата: 21.03.05 15:02
    Оценка:
    Здравствуйте, Privalov, Вы писали:

    P>Потому что в системах типа Windows процесс содержит не менее одного потока.

    А причем тут "системы типа Windows" ?
    Re[5]: Активные объекты в С++
    От: Трурль  
    Дата: 21.03.05 15:05
    Оценка:
    Здравствуйте, Mr. None, Вы писали:

    MN>Ещё раз определение активного объекта — это объект обладающий собственным потоком управления, в рамках которого будут исполняться все запросы (синхронные или асинхронные) к данному объекту.


    Гораздо чаще можно встретить такое определение.

    Активный объект — это объект обладающий собственным потоком управления.

    Re[6]: Активные объекты в С++
    От: Cyberax Марс  
    Дата: 21.03.05 15:05
    Оценка: +1
    Сергей Губанов пишет:

    > MN>...Ещё раз определение активного объекта — это объект обладающий

    > собственным потоком управления, в рамках которого будут исполняться
    > все запросы (синхронные или асинхронные) к данному объекту...
    > Да с какой стати все-то? Не все, а некоторые. Есть же целое семейство
    > запросов не нуждающихся в синхронизации вообще (не имеющих EXCLUSIVE
    > блока). Например методы навроде:
    >
    >int GetValue()
    >{
    > return this.privateValue;
    >}
    >
    > уж точно не нуждаются в синхронизации и могут исполняться
    > непосредственно в вызывающем потоке параллельно с остальными потоками
    > не вызывая накладных расходов на блокировку.

    Неправда, даже такие методы нуждаются в синхронизации (в 99% случаев),
    точнее нужен read-barrier, который создается при синхронизации. Читатать
    здесь: http://gee.cs.oswego.edu/dl/cpj/jmm.html , хотя тут и про Java
    написано, но принципы остаются теми же самыми.

    --
    С уважением,
    Alex Besogonov (alexy@izh.com)
    Posted via RSDN NNTP Server 1.9
    Sapienti sat!
    Re[7]: Активные объекты в С++
    От: Privalov  
    Дата: 21.03.05 15:38
    Оценка:
    Здравствуйте, Трурль, Вы писали:

    Т>Здравствуйте, Privalov, Вы писали:


    P>>Потому что в системах типа Windows процесс содержит не менее одного потока.

    Т>А причем тут "системы типа Windows" ?

    Потому что я не знаю точное определение потока в системах типа UNIX, OS/2 или OS/360.
    Re[5]: Активные объекты в С++
    От: Кодт Россия  
    Дата: 21.03.05 18:01
    Оценка: +2
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Zonnon активности именно так и устроены: активные объекты могут вести диалог по заранее описанному в EBNF форме протоколу — каждый из них находится в своем потоке, а посланные ему сообщения ставятся в очередь. Только кроме этого, дополнительно, можно исполнять методы объекта как обычно — в потоке вызвавшем этот метод, а когда выполнение дойдет до EXCLUSIVE блока (если дойдет), то тут уже сложно сказать где чей поток, так как внутри EXCLUSIVE блока одновременно может находится только один поток, а какой он — вызвавший, вызываемый или третий специальный... это уже не так важно.


    ... думаете вы! (с) синхронный перевод с немецкого.

    Эксклюзивным может и должен быть доступ к разделяемым данным — например, к активному объекту целиком. А не посещение отдельных участков кода.

    Представь себе, что есть две эксклюзивные функции, работающие с разделяемыми данными некоего АО.
    Посторонний АО залез в первую (и заблокировал её), ещё один посторонний АО — во вторую (и также заблокировал). А дальше они поплясали вместе на костях.
    Ну и кому нафиг это надо?
    Перекуём баги на фичи!
    Re: Активные объекты в С++
    От: Шахтер Интернет  
    Дата: 22.03.05 04:30
    Оценка: :)
    Здравствуйте, Сергей Губанов, Вы писали: ...

    1) Набор банальностей, поданных с большим пафосом неофита.
    2) За использование макросов в современном С++ больно бьют куда попало.
    3)
    
    #define X_BEGIN try { X_ENTER;
    
    #define X_END X_LEAVE; } catch(...) { X_LEAVE; throw; }


    Ну так не модно. Настоящие пацаны заводят объект-локер.

    4) Понятие активного объекта и форма его реализации, введённое в статье известны сто лет. По сути -- запуск потока с передачей управления методу объекта.
    Плюс к объекту добавлен объект для синхронизации внутри его методов -- колоссальный прорыв в программировании. Ну а если хочется несколько крит. секций использовать в активном объекте, тогда как?

    5) А как там насчет lock-free методов?

    6) Очереди запросов предлагается конструировать вручную?

    ...

    Бурда, короче.
    ... << RSDN@Home 1.1.3 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[6]: Активные объекты в С++
    От: Mr. None Россия http://mrnone.blogspot.com
    Дата: 22.03.05 04:44
    Оценка:
    Здравствуйте, Cyberax, Вы писали:


    C>Я знаю. А еще лучше в качестве активных объектов приводить в пример

    C>COM-объекты в апартаментах.

    Именно эта идея неожиданно пришла и мне в голову по дороге домой
    Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
    Re[6]: Активные объекты в С++
    От: Mr. None Россия http://mrnone.blogspot.com
    Дата: 22.03.05 04:46
    Оценка:
    Здравствуйте, Трурль, Вы писали:

    Т>Здравствуйте, Mr. None, Вы писали:


    MN>>Ещё раз определение активного объекта — это объект обладающий собственным потоком управления, в рамках которого будут исполняться все запросы (синхронные или асинхронные) к данному объекту.


    Т>Гораздо чаще можно встретить такое определение.

    Т>

    Активный объект — это объект обладающий собственным потоком управления.


    А вот это не совсем корректно. Под этот термин попадает в том числе объектная обёртка, создающий для выполнения некоторой операции поток, а это уже не активный объект..
    Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
    Re[5]: Активные объекты в С++
    От: Mr. None Россия http://mrnone.blogspot.com
    Дата: 22.03.05 04:52
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Здравствуйте, Mr. None, Вы писали:


    MN>>...согласно банальной культуре оформления статей...


    СГ>Так, на всякий случай замечу, что это претензии, вообще-то, к автору статьи, а не ко мне.


    MN>> Вот пока не приведёте ссылку, давайте вы не будете переливать из пустого в порожнее.


    СГ>Вот активные объекты, не из книжки вычитанные, а уже реализованные настоящие живые: http://bluebottle.ethz.ch/

    СГ>А вот, собственно, и сам автор Prof. Dr. Jurg Gutknecht (автор языка Active Oberon, соавтор нескольких ОО операционных систем, руководитель группы Programming Languages and Runtime Systems Research Group в ETH) http://www.inf.ethz.ch/personal/gutknech/ у него на странице есть ссылки на соотвествующую литературу (правда некоторые по немецки).

    Я вам про Фому, а вы мне про Ерёму... Что вы мне ссылки кидаете на какие-то непонятные реализации непонятно чего... Тем более, что я там не нашёл ни одного определения активного объекта.

    СГ>... а когда выполнение дойдет до EXCLUSIVE блока (если дойдет), то тут уже сложно сказать где чей поток, так как внутри EXCLUSIVE блока одновременно может находится только один поток, а какой он — вызвавший, вызываемый или третий специальный... это уже не так важно.


    Ничего не понял, какой EXCLUSIVE блок, откуда столько потоков и почему неважно, какой работает...
    Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
    Re: Активные объекты
    От: Mr. None Россия http://mrnone.blogspot.com
    Дата: 22.03.05 05:24
    Оценка: 44 (6)
    Материал подготовлен на основе глав книги Антона Элиенса — "Принципы объектно-ориентированной разработки программ".
    Идея активных объектов возникла в результате попыток объекдинения объектно-ориентированной парадигмы и поддержки параллельных вычислений в языках программирования. Активный объект харктеризуется наличием так называемого тела (body) — собственного независимого потока управления объекта в рамках которого может выполняться некоторая функциональность. Это позволяет нескольким активным объектам выполнять свои действия параллельно. Взаимодействие между активным объектами осуществляется с помощью синхронного механизма рандеву. Чтобы включиться в рандеву, активный объект должен явным образом прервать исполнение своего тела с помощью специального оператора приёма, предусмотренного средой исполнения (accept). Вызов этого оператора уведомляет среду исполнения о том, что активный объект желает получить очередное сообщение от другого объекта (активного или нет) и возможно ответить на него. Отправка сообщений активному объекту может быть как синхронной так и асинхронной.
    Понятие активного объекта сопряжено с рядом проблем. Основная проблема — возможность само-блокировки активного объекта при попытке отправить сообщения самому себе. Другая чисто философская — если язык программирования поддерживает активные объекты, должны ли все объекты быть активными или наряду с активными объектами возможно наличие пассивных объектов.
    В таком виде активные объекты, с точностью до названий терминов и наименований операторов, представлены в следующих языках программирования: POOL [1], Ада, Hybrid [2], sC++ [3] (версия C++, расширенная синхронными активными объектами — язык предложен и описан, но реализован не был). Предлагалась реализация этого понятия в языке Java, но без поддержки на уровне компилятора.
    Естественное развитие идея активных объектов получила в языке Distributed Smalltalk [4] (рапределённый Smalltalk). Этот язык поддерживает объекты, которые могут реально располагаться на разных процессорах и даже разных машинах и общаться друг с другом посредством передачи сообщений.

    1. America P. [1987] POOL-T: a parallel object-oriented language; in Object-oriented concurent systems [Yonezawa A., Tokoro M., MIT Press 1987].
    2. Nierstrasz O. [1987] Active objects in Hybrid; in Proc. OOPSLA'87, pp. 243-253.
    3. PetitPierre C. [1998] Synchronous C++, a language for interactive applications, IEEE Computer, 31(9), pp.65-72.
    4. Bennett J. K. [1987] The design and implementation of Distributed Smalltalk; in Proc. OOPSLA'87, pp. 318-330.
    Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
    Re[6]: Активные объекты в С++
    От: Mr. None Россия http://mrnone.blogspot.com
    Дата: 22.03.05 05:25
    Оценка:
    Здравствуйте, Mr. None, Вы писали:

    MN>Здравствуйте, Сергей Губанов, Вы писали:


    СГ>>Здравствуйте, Mr. None, Вы писали:


    MN>>>...согласно банальной культуре оформления статей...


    СГ>>Так, на всякий случай замечу, что это претензии, вообще-то, к автору статьи, а не ко мне.


    MN>>> Вот пока не приведёте ссылку, давайте вы не будете переливать из пустого в порожнее.


    СГ>>Вот активные объекты, не из книжки вычитанные, а уже реализованные настоящие живые: http://bluebottle.ethz.ch/

    СГ>>А вот, собственно, и сам автор Prof. Dr. Jurg Gutknecht (автор языка Active Oberon, соавтор нескольких ОО операционных систем, руководитель группы Programming Languages and Runtime Systems Research Group в ETH) http://www.inf.ethz.ch/personal/gutknech/ у него на странице есть ссылки на соотвествующую литературу (правда некоторые по немецки).

    MN>Я вам про Фому, а вы мне про Ерёму... Что вы мне ссылки кидаете на какие-то непонятные реализации непонятно чего... Тем более, что я там не нашёл ни одного определения активного объекта.


    Не стал всё сваливать в кучу: читать про активный объекты здесь.
    Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
    Re[7]: Активные объекты в С++
    От: Mr. None Россия http://mrnone.blogspot.com
    Дата: 22.03.05 05:25
    Оценка:
    Здравствуйте, Mr. None, Вы писали:

    MN>Здравствуйте, Трурль, Вы писали:


    Т>>Здравствуйте, Mr. None, Вы писали:


    MN>>>Ещё раз определение активного объекта — это объект обладающий собственным потоком управления, в рамках которого будут исполняться все запросы (синхронные или асинхронные) к данному объекту.


    Т>>Гораздо чаще можно встретить такое определение.

    Т>>

    Активный объект — это объект обладающий собственным потоком управления.


    MN>А вот это не совсем корректно. Под этот термин попадает в том числе объектная обёртка, создающий для выполнения некоторой операции поток, а это уже не активный объект..


    Не стал всё сваливать в кучу: прочитать про активный объекты можно здесь.
    Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
    Re[6]: Активные объекты в С++
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 22.03.05 07:39
    Оценка:
    Здравствуйте, Кодт, Вы писали:

    К> Эксклюзивным может и должен быть доступ к разделяемым данным — например, к активному объекту целиком. А не посещение отдельных участков кода.


    Разумеется так и есть. У одного объекта есть много методов. Внутри каждого метода может быть несколько эксклюзивных секций кода. Внутрь какой либо эксклюзивной секции данного объекта одновременно впускается только одна активность. До тех пор пока эта активность там хозяйничает, никакая другая активность ни в какой другой эксклюзивный блок данного объекта впущена не будет. Таким образом, изменение данных этого объекта одновременно происходит только врамках одного потока, остальные ждут пока он не выйдет из эксклюзивного блока либо не уснет в нем на AWAIT.
    Re[7]: Активные объекты в С++
    От: Mr. None Россия http://mrnone.blogspot.com
    Дата: 22.03.05 08:51
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Разумеется так и есть. У одного объекта есть много методов. Внутри каждого метода может быть несколько эксклюзивных секций кода. Внутрь какой либо эксклюзивной секции данного объекта одновременно впускается только одна активность. До тех пор пока эта активность там хозяйничает, никакая другая активность ни в какой другой эксклюзивный блок данного объекта впущена не будет. Таким образом, изменение данных этого объекта одновременно происходит только врамках одного потока, остальные ждут пока он не выйдет из эксклюзивного блока либо не уснет в нем на AWAIT.


    Вот только это называется не активным объектом, а объектом, использующим потоки и синхронизацию доступа...
    Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
    Re[2]: Активные объекты
    От: Трурль  
    Дата: 22.03.05 13:48
    Оценка:
    Здравствуйте, Mr. None, Вы писали:

    MN>Идея активных объектов возникла в результате попыток объекдинения объектно-ориентированной парадигмы и поддержки параллельных вычислений в языках программирования. Активный объект харктеризуется наличием так называемого тела (body) — собственного независимого потока управления объекта в рамках которого может выполняться некоторая функциональность. Это позволяет нескольким активным объектам выполнять свои действия параллельно.


    До этого места замечательно. А дальше почему-то описывается механизм рандеву и утверждается, что именно так и должны взаимодействовать активные объекты.
    Задачи Ады, естественно, используют рандеву, но вряд-ли их можно считать объектами. В Hybrid, как правило, несколькр активных объектов разделяют один поток.

    Недоумение вызывает и следующее утверждение:
    MN>... sC++ [3] (версия C++, расширенная синхронными активными объектами — язык предложен и описан, но реализован не был).

    The current version of our extensions, containing a preprocessor, a run time library and two libraries that implement UNIX sockets and Motif widgets as active objects, is freely available on the anonymous server

    Acive Objects: a Paradigm for Communications and Event Driven Systems, G. Caal, A. Divin, C. Petitpierre,1994
    Re[7]: Активные объекты в С++
    От: Кодт Россия  
    Дата: 22.03.05 13:58
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    К>> Эксклюзивным может и должен быть доступ к разделяемым данным — например, к активному объекту целиком. А не посещение отдельных участков кода.


    СГ>Разумеется так и есть. У одного объекта есть много методов. Внутри каждого метода может быть несколько эксклюзивных секций кода. Внутрь какой либо эксклюзивной секции данного объекта одновременно впускается только одна активность. До тех пор пока эта активность там хозяйничает, никакая другая активность ни в какой другой эксклюзивный блок данного объекта впущена не будет. Таким образом, изменение данных этого объекта одновременно происходит только врамках одного потока, остальные ждут пока он не выйдет из эксклюзивного блока либо не уснет в нем на AWAIT.


    Тогда в чём сермяжная правда и отличие от захвата-освобождения мутексов, практикуемого во многих средах и языках?
    Для любителей делать begin-end блоки — в С++ предусмотрена идиома scope guard.
    Перекуём баги на фичи!
    Re[2]: Активные объекты в С++
    От: Трурль  
    Дата: 22.03.05 14:20
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Если уж архитектор (проектировщик) не должен думать о том, будет ли приложение работать в виде одного многопоточного процесса или множества однопоточных процессов, то...


    А, собственно, что то...?

    Если уж архитектор (проектировщик) не должен думать о том, в каком оверлее (вариант: на какой дорожке) должна размещаться процедура то...
    Re[3]: Активные объекты в С++
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 22.03.05 14:31
    Оценка:
    Здравствуйте, Трурль, Вы писали:

    Т>Здравствуйте, eao197, Вы писали:


    E>>Если уж архитектор (проектировщик) не должен думать о том, будет ли приложение работать в виде одного многопоточного процесса или множества однопоточных процессов, то...


    Т>А, собственно, что то...?


    А то, что если приложение работает в виде взаимодействующих потоков, то нужно решать, какой механизм взаимодействия между ними нужно использовать: CORBA, PVM, MPI, собственное решение на базе pipe, shared memory, sockets. Должны ли процессы запускаться по одному на каждый запрос (транзакцию) или нужно иметь пул процессов. Должно ли решение использоваться на SMP архитектурах или на sharing nothing класстерах. Такая БД для приложения должна использоваться. И т.д. и т.п.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[8]: Активные объекты в С++
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 22.03.05 15:02
    Оценка: +1
    Здравствуйте, Кодт, Вы писали:

    К>Тогда в чём сермяжная правда и отличие от захвата-освобождения мутексов, практикуемого во многих средах и языках?

    К>Для любителей делать begin-end блоки — в С++ предусмотрена идиома scope guard.

    Серьмяжная правда заключается в повышении уровня абстракции.

    На одной чаше весов находятся всего три универсальных понятия "EXCLISIVE, AWAIT, ACTIVE" на другой чаше весов находятся процессы, потоки, мютексы, мониторы, сигналы, этот Ваш scope guard, и т.д. и т.п. Весы находятся в равновесии ибо сущности равновесны. Однако: "EXCLISIVE, AWAIT, ACTIVE" — это понятия уровня проектирования, в то время как "процессы, потоки, мютексы, мониторы, сигналы, и т.д. и т.п." — это понятия низкоуровневой реализации.
    Re[6]: Активные объекты в С++
    От: Gaperton http://gaperton.livejournal.com
    Дата: 22.03.05 16:44
    Оценка:
    Здравствуйте, Cyberax, Вы писали:

    C>Функциональные языки со ссылочной целостностью как раз ПОЗВОЛЯЮТ

    C>реализовать AWAIT в полном объеме и эффективно. В том же MLе есть
    C>действительно прозрачная многозадачность:
    C>http://portal.acm.org/citation.cfm?id=866513

    C>Есть и практическая реально используемая реализация: Erlang.

    Гхм...
    1) В Erlang посылка сообщения является побочным эффектом. Так что как только вы начинаете говорить о параллельности, вы можете сказать ссылочной целостности "дазвиданья".
    2) В Erlang не предусмотрено примитивов синхронизации. Вообще.
    3) Потому, что в Erlang у процессов нет разделяемых данных. Все данные локальны для процессов.
    4) И единственный способ обмена информацией между процессами — обмен сообщениями с копирующей семантикой.
    5) Есть библиотека для Python, позволяющая писать в таком же стиле. Так же работал Smalltalk 72. Этот стиль не имеет практически никакого отношения ни к ФЯ, ни к прозрачности по ссылкам.
    Re[7]: Активные объекты в С++
    От: zzz-zzz Беларусь  
    Дата: 22.03.05 18:02
    Оценка:
    Здравствуйте, Gaperton, Вы писали:


    G>2) В Erlang не предусмотрено примитивов синхронизации. Вообще.


    Я уже дико извиняюсь, но это не совсем так. Действительно, всяких мутексов-шмутексов там нет, но операции посылки и получения сообщения таки являются примитивами синхронизации, как ни крути.
    Re[9]: Активные объекты в С++
    От: Кодт Россия  
    Дата: 22.03.05 18:11
    Оценка: 14 (3)
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Серьмяжная правда заключается в повышении уровня абстракции.


    СГ>На одной чаше весов находятся всего три универсальных понятия "EXCLISIVE, AWAIT, ACTIVE" на другой чаше весов находятся процессы, потоки, мютексы, мониторы, сигналы, этот Ваш scope guard, и т.д. и т.п. Весы находятся в равновесии ибо сущности равновесны. Однако: "EXCLISIVE, AWAIT, ACTIVE" — это понятия уровня проектирования, в то время как "процессы, потоки, мютексы, мониторы, сигналы, и т.д. и т.п." — это понятия низкоуровневой реализации.


    Если мы отвлечёмся от топика, и обратимся к другому виду ресурса (а эксклюзивность — это ресурс) — то получим интересную аналогию.
    Итак, ресурс: файл.

    Если ресурс — внешний по отношению к коду, мы работаем с ним как с объектом.

    В неуправляемом стиле:
    File file;
    
    file.open("path");
    var = file.read();
    file.write(expression());
    
    File another_file; // одновременно с первым
    another_file.open("another.path");
    
    file.write(another_file.read());
    
    another_file.close();
    file.close();


    В стиле scope-guard
    { File file("path");
      .....
      { File another_file("another.path");
        .....
      }
      .....
    }


    В стиле enter-leave мы работаем с ресурсом не как с объектом, а как с субъектом.
    BEGIN_WORKING_WITH_FILE("path");
      var = read();
      write(expression());
      // как представить работу с двумя файлами сразу - загадка...
    END_WORKING_WITH_FILE;


    Такой стиль вполне имеет право на существование.
    Например, консольный скрипт, который переключает свой вывод (stdout) в файл.
    Или инструментированный скрипт на PHP, зипующий и кэширующий страницу, которую выводит его собственная подпрограмма.

    Какие-то глобальные ресурсы — скажем, соединение с БД, или контекст поиска имён в скриптовом языке — вполне возможно оформлять таким способом.

    Данный поток вычислений в каждый момент имеет дело с одним-единственным субъектом. Точнее, это субъект имеет дело вычислениями ;)



    Во многих вычислительных средах субъектом является контекст потока. Это он занимается вычислениями, а данные, которых он касается — объекты. И, как правило, в системе есть ручки, позволяющие другим субъектам обращаться к этому как к объекту — создавать, синхронизироваться, убивать.
    Такая дуальная природа контектста потока приводит к идее Активного Объекта: субъект, который формально представлен полноценным объектом вычислительной среды (т.е. экземпляром класса, с методами и прочими красивостями).
    Тем не менее, для многозадачности важна именно субъектная сущность: собственное течение времени, собственные взаимодействия с ресурсами (одним из которых является эксклюзивный доступ к "собственным" данным).
    Перекуём баги на фичи!
    Re[8]: Активные объекты в С++
    От: Gaperton http://gaperton.livejournal.com
    Дата: 22.03.05 19:53
    Оценка: 7 (1) +2
    Здравствуйте, zzz-zzz, Вы писали:

    ZZ>Здравствуйте, Gaperton, Вы писали:



    G>>2) В Erlang не предусмотрено примитивов синхронизации. Вообще.


    ZZ>Я уже дико извиняюсь, но это не совсем так. Действительно, всяких мутексов-шмутексов там нет, но операции посылки и получения сообщения таки являются примитивами синхронизации, как ни крути.


    Считать или нет операцию асинхронной посылки сообщения и блокирующую синхронную операцию получения сообщения примитивами синхронизации — вопрос глубоко философский .

    Я не считаю это примитивами синхронизации. Здесь синхронизировать нечего и незачем — у процессов просто-напросто нет разделяемых данных, и соответственно, нет необходимости контроллировать доступ к ним. Операции посылки/получения ровным счетом ничего не синхронизируют, у них соверщенно другое предназначение.

    Впрочем, "хоть горшком назови, только в печь не ставь."
    Re[3]: Активные объекты
    От: Mr. None Россия http://mrnone.blogspot.com
    Дата: 23.03.05 04:23
    Оценка:
    Здравствуйте, Трурль, Вы писали:

    Т>До этого места замечательно. А дальше почему-то описывается механизм рандеву и утверждается, что именно так и должны взаимодействовать активные объекты.

    Я же сказал, с точностью до названия терминов. Для Ады — это рандеву, для C++ — это будет ожидание в режиме ядра на некотором событии или порту завершения ввода-вывода.

    Т>Задачи Ады, естественно, используют рандеву, но вряд-ли их можно считать объектами.

    Это уже флейм получится... Модули по типу модулей Паскаля многие склонны рассматривать тоже как объекты, причём истинные объекты с абсолютной инкапсуляцией (только это относится не к объектно-ориентированной, а к объектной парадигме).
    А объекты языка Vulcan (объектно-ориентированный наследник параллельного пролога) вообще ни на что не похожи...


    Т>В Hybrid, как правило, несколькр активных объектов разделяют один поток.

    А где противоречие со всем сказанным выше?


    Т>Недоумение вызывает и следующее утверждение:

    MN>>... sC++ [3] (версия C++, расширенная синхронными активными объектами — язык предложен и описан, но реализован не был).

    Т>

    The current version of our extensions, containing a preprocessor, a run time library and two libraries that implement UNIX sockets and Motif widgets as active objects, is freely available on the anonymous server


    Препроцессор и 2 библиотеки — это ещё не полноценная реализация языка... Я думаю, когда Страуструп придумывал C++, он тоже мог накидать некий простой компилятор, но говорить о нём как о реализации языка смешно.
    Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
    Re[9]: Активные объекты в С++
    От: А почему вы спрашиваете Беларусь  
    Дата: 23.03.05 07:25
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>Здравствуйте, zzz-zzz, Вы писали:


    ZZ>>Здравствуйте, Gaperton, Вы писали:



    G>>>2) В Erlang не предусмотрено примитивов синхронизации. Вообще.


    ZZ>>Я уже дико извиняюсь, но это не совсем так. Действительно, всяких мутексов-шмутексов там нет, но операции посылки и получения сообщения таки являются примитивами синхронизации, как ни крути.


    G>Считать или нет операцию асинхронной посылки сообщения и блокирующую синхронную операцию получения сообщения примитивами синхронизации — вопрос глубоко философский .


    G>Я не считаю это примитивами синхронизации. Здесь синхронизировать нечего и незачем — у процессов просто-напросто нет разделяемых данных, и соответственно, нет необходимости контроллировать доступ к ним. Операции посылки/получения ровным счетом ничего не синхронизируют, у них соверщенно другое предназначение.


    Ну философия тут не так чтобы уж совсем бездонно глубокая.

    Да, erlang'овцы действительно избавились от значительной части проблем с синхронизацией, что не удивительно: меньше разделяемых ресурсов — меньше плясок с синхронизацией. Это очень простая и прозрачная мысль.

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

    Считать ли асинхронную посылку и синхронное получение примитивами синхронизации? Если всякие разные мутексы, барьеры и семафоры с их помощью тривиально реализуются, то вывод тут однозначен.
    Re[9]: Активные объекты в С++
    От: RailRoadMan  
    Дата: 23.03.05 07:45
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Здравствуйте, Кодт, Вы писали:


    К>>Тогда в чём сермяжная правда и отличие от захвата-освобождения мутексов, практикуемого во многих средах и языках?

    К>>Для любителей делать begin-end блоки — в С++ предусмотрена идиома scope guard.

    СГ>Серьмяжная правда заключается в повышении уровня абстракции.


    СГ>На одной чаше весов находятся всего три универсальных понятия "EXCLISIVE, AWAIT, ACTIVE" на другой чаше весов находятся процессы, потоки, мютексы, мониторы, сигналы, этот Ваш scope guard, и т.д. и т.п. Весы находятся в равновесии ибо сущности равновесны. Однако: "EXCLISIVE, AWAIT, ACTIVE" — это понятия уровня проектирования, в то время как "процессы, потоки, мютексы, мониторы, сигналы, и т.д. и т.п." — это понятия низкоуровневой реализации.


    Хочется заметить, что из того, что лежит на чаше "сущностей низкоуровневой реализации" всегда можно сделать то, что лежит на другой чаще.

    Я если посмотреть на поток как на "поток управления", т.е. некую сущность выполняющую код, то это далеко не низкоуровневая деталь реализации.
    Re[10]: Активные объекты в С++
    От: Gaperton http://gaperton.livejournal.com
    Дата: 23.03.05 10:26
    Оценка: :)
    Здравствуйте, А почему вы спрашиваете, Вы писали:

    АПВ>Однако отсутствие разделяемых данных не означает, что нет вообще никаких разделяемых ресурсов. Разделяемым ресурсом в данном случае является объективная реальность, данная нам, так сказать, посредством устройств ввода/вывода. Она у нас одна и доступ к ней порой приходится синхронизировать.


    АПВ>Считать ли асинхронную посылку и синхронное получение примитивами синхронизации? Если всякие разные мутексы, барьеры и семафоры с их помощью тривиально реализуются, то вывод тут однозначен.


    Ну да, ну да. "Считать ли С объектно-ориентированным языком? Здесь нет никакой особо глубокой философии. Если классы с VMT тривиально реализуются на C, то вывод тут однозначен".

    Вы на Эрланге хоть что-нибудь писали? Если бы писали, или хотя-бы интересовались, то знали бы, что "разделяемый ресурс" просто-напросто заворачивают в процесс . Не нужны там мьютексы, барьеры и семафоры и прочее удаление гланд через задний проход. Не думает эрланговский программист о синхронизации — нет у него таких проблем. Нет синхронизации — нет и примитивов синхронизации. А все остальное, как любил говорить мне уважаемый Трурль , существует только в вашем сознании.
    Re[11]: Активные объекты в С++
    От: А почему вы спрашиваете Беларусь  
    Дата: 23.03.05 10:46
    Оценка: 8 (1)
    Здравствуйте, Gaperton, Вы писали:

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


    Ой, вэй! Как вы мошете так говорить, когда 6 миллио^W^W самая главная статья про формальную верификацию кода на эрланге посвящена, угадайте чему? Вы будете смеяться, она посвящена resource locker'у, который представляет собой именно средство синхорнизации доступа к ресурсу.


    @inproceedings{730165,
    author = {Thomas Arts and Clara Benac Earle and John Derrick},
    title = {Verifying Erlang Code: A Resource Locker Case-Study},
    booktitle = {FME '02: Proceedings of the International Symposium of Formal Methods Europe on Formal Methods — Getting IT Right},
    year = {2002},
    isbn = {3-540-43928-5},
    pages = {184--203},
    publisher = {Springer-Verlag},
    }

    Re[12]: Активные объекты в С++
    От: Gaperton http://gaperton.livejournal.com
    Дата: 23.03.05 11:15
    Оценка:
    Здравствуйте, А почему вы спрашиваете, Вы писали:

    АПВ>Здравствуйте, Gaperton, Вы писали:


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


    АПВ>Ой, вэй! Как вы мошете так говорить, когда 6 миллио^W^W самая главная статья про формальную верификацию кода на эрланге посвящена, угадайте чему? Вы будете смеяться, она посвящена resource locker'у, который представляет собой именно средство синхорнизации доступа к ресурсу.


    Дарагой, зачем смеяться, да?
    1) Доступа не к ресурсу, а к списку ресурсов.
    2) Locker — это процесс, который управляет ресурсами.
    3) Нужно это все для распределенных транзакций, чтобы скоординированно поменять несколько ресурсов, живущих в разных процессах.
    4) Буду вам очень признателен, если вы объясните, при чем здесь сообщения, и как из всего этого следует, что операции приема и посылки можно назвать примитивами синхронизации.
    Re[13]: Активные объекты в С++
    От: А почему вы спрашиваете Беларусь  
    Дата: 23.03.05 11:27
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>1) Доступа не к ресурсу, а к списку ресурсов.


    Что совой об пень, что пнем об сову. Какая разница, список там или один ресурс?

    G>2) Locker — это процесс, который управляет ресурсами.


    Ну, процесс, ну и что? Это чему-от противоречит? Ничем он, кстати, там не управляет, он просто предоставляет API для mutual exlusion при доступе к множеству ресурсов.

    G>3) Нужно это все для распределенных транзакций, чтобы скоординированно поменять несколько ресурсов, живущих в разных процессах.

    G>4) Буду вам очень признателен, если вы объясните, при чем здесь сообщения, и как из всего этого следует, что операции приема и посылки можно назвать примитивами синхронизации.

    Операции приема и посылки — единственный способ межпроцессного взаимодействия для эрланговских процессов. Раз реализуем такую форму синхронизации, как mutual exlusion, то делаем это при помощи этих самых операций.
    Re[14]: Активные объекты в С++
    От: Gaperton http://gaperton.livejournal.com
    Дата: 23.03.05 11:48
    Оценка:
    Здравствуйте, А почему вы спрашиваете, Вы писали:

    G>>2) Locker — это процесс, который управляет ресурсами.

    АПВ>Ну, процесс, ну и что? Это чему-от противоречит? Ничем он, кстати, там не управляет, он просто предоставляет API для mutual exlusion при доступе к множеству ресурсов.

    Это ничему особо противоречить не может, так как совершенно не относится к вопросу примитовов синхронизации. Сам локер очевидно "примитивом" не является.

    G>>4) Буду вам очень признателен, если вы объясните, при чем здесь сообщения, и как из всего этого следует, что операции приема и посылки можно назвать примитивами синхронизации.

    АПВ>Операции приема и посылки — единственный способ межпроцессного взаимодействия для эрланговских процессов. Раз реализуем такую форму синхронизации, как mutual exlusion, то делаем это при помощи этих самых операций.

    Это я понимаю . Я не понимаю, почему эти самые операции посылки-приема становятся от этого примитивами синхронизации. С такой логикой вы и ассемблерные команды, из которых межмашинный mutex собран, примитивами синхронизации обзовете .
    Re[15]: Активные объекты в С++
    От: А почему вы спрашиваете Беларусь  
    Дата: 23.03.05 12:08
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>Это ничему особо противоречить не может, так как совершенно не относится к вопросу примитовов синхронизации. Сам локер очевидно "примитивом" не является.


    Примитивом конечно же не является. Пример Locker'а был приведен для того, чтобы иллюстрировать тезис, что проблемы синхронизации стоят и при программировании на Erlang'е. Пусть и не так остро, как при программировании на других языках. Вообще, эрланговская модель параллелизма очень хороша и писать с ее помощью очень приятно. Но проблемы синхронизации (synchronization is coordination with respect to time) — это неотъемлемая часть параллельного программирования и полностью избежать их невозможно. В этом собственно и состоял пафос моего выступления.

    G>>>4) Буду вам очень признателен, если вы объясните, при чем здесь сообщения, и как из всего этого следует, что операции приема и посылки можно назвать примитивами синхронизации.

    АПВ>>Операции приема и посылки — единственный способ межпроцессного взаимодействия для эрланговских процессов. Раз реализуем такую форму синхронизации, как mutual exlusion, то делаем это при помощи этих самых операций.

    G>Это я понимаю . Я не понимаю, почему эти самые операции посылки-приема становятся от этого примитивами синхронизации. С такой логикой вы и ассемблерные команды, из которых межмашинный mutex собран, примитивами синхронизации обзовете .


    Вы же не будете отрицать, что той самой пресловутой coordination with respect to time можно достичь посылкой сообщения?

    Я понимаю, что Вас смущает. Вас смушает, что сообщения — это не только и не столько синхронизация, так? Думаю, что здесь нет никакой проблемы. Сообщения — примитивы межпроцессного взаимодействия, синхронизация — частный случай межпроцессного взаимодействия, следовательно сообщения — примитивы синхронизации в том числе.
    Re[16]: Активные объекты в С++
    От: Gaperton http://gaperton.livejournal.com
    Дата: 23.03.05 12:33
    Оценка:
    Здравствуйте, А почему вы спрашиваете, Вы писали:

    АПВ>Здравствуйте, Gaperton, Вы писали:


    G>>Это ничему особо противоречить не может, так как совершенно не относится к вопросу примитовов синхронизации. Сам локер очевидно "примитивом" не является.


    АПВ>Примитивом конечно же не является. Пример Locker'а был приведен для того, чтобы иллюстрировать тезис, что проблемы синхронизации стоят и при программировании на Erlang'е. Пусть и не так остро, как при программировании на других языках. Вообще, эрланговская модель параллелизма очень хороша и писать с ее помощью очень приятно. Но проблемы синхронизации (synchronization is coordination with respect to time) — это неотъемлемая часть параллельного программирования и полностью избежать их невозможно. В этом собственно и состоял пафос моего выступления.


    Соглашусь, все безусловно так.

    G>>>>4) Буду вам очень признателен, если вы объясните, при чем здесь сообщения, и как из всего этого следует, что операции приема и посылки можно назвать примитивами синхронизации.

    АПВ>>>Операции приема и посылки — единственный способ межпроцессного взаимодействия для эрланговских процессов. Раз реализуем такую форму синхронизации, как mutual exlusion, то делаем это при помощи этих самых операций.

    G>>Это я понимаю . Я не понимаю, почему эти самые операции посылки-приема становятся от этого примитивами синхронизации. С такой логикой вы и ассемблерные команды, из которых межмашинный mutex собран, примитивами синхронизации обзовете .


    АПВ>Вы же не будете отрицать, что той самой пресловутой coordination with respect to time можно достичь посылкой сообщения?

    Посылка сообщения будет здесь лишь средством — транспортом. Убить человека можно: лопатой, кулаком, вилкой, столовым ножом, и цветочным горшком. Ничего из перечисленного оружием не является , но может стать орудием убийства. Когда вы рассматриваете нечто как оружие, вы рассматриваете это нечто вне контекста конкретного убийства. Вне этого контекста вилка — столовый прибор.

    Так же и сообщение — это просто транспорт. Последством которого много чего можно организовать, в том числе и синхронизацию.

    АПВ>Я понимаю, что Вас смущает. Вас смушает, что сообщения — это не только и не столько синхронизация, так? Думаю, что здесь нет никакой проблемы. Сообщения — примитивы межпроцессного взаимодействия, синхронизация — частный случай межпроцессного взаимодействия, следовательно сообщения — примитивы синхронизации в том числе.


    Вот я и говорю — глубокий философский вопрос . Давайте поговорим об этом. Вам должно быть известно, что любой примитив синхронизации выразим через семафор (Дейкстра). Попробуйте сделать это с сообщениями . Как вы думаете — получится?
    Re[17]: Активные объекты в С++
    От: А почему вы спрашиваете Беларусь  
    Дата: 23.03.05 12:50
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    АПВ>>Я понимаю, что Вас смущает. Вас смушает, что сообщения — это не только и не столько синхронизация, так? Думаю, что здесь нет никакой проблемы. Сообщения — примитивы межпроцессного взаимодействия, синхронизация — частный случай межпроцессного взаимодействия, следовательно сообщения — примитивы синхронизации в том числе.


    G>Вот я и говорю — глубокий философский вопрос . Давайте поговорим об этом. Вам должно быть известно, что любой примитив синхронизации выразим через семафор (Дейкстра). Попробуйте сделать это с сообщениями . Как вы думаете — получится?


    Думаю получится. Достаточно реализовать семафор. Сделать это, как вы сами догадываетесь, несложно. Сделаем процесс semaphore_server. Дальше надо рассказывать?
    Re[9]: Активные объекты в С++
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 23.03.05 13:19
    Оценка: +1
    Здравствуйте, Gaperton, Вы писали:

    G>Считать или нет операцию асинхронной посылки сообщения и блокирующую синхронную операцию получения сообщения примитивами синхронизации — вопрос глубоко философский .

    Ну, Дийкстра называл это "гармонично взаимодействующими процессами" и считал наиболее совершенным решением проблемы синхронизации. Тем не менее "примитивом" обычно все же называют нечто атомарное. Это не процесс и не функция, а именно объект. Поэтому я склоняюсь к отказу называть технологию гармонично взаимодействующих процессов примитивом синхронизации.
    ... << RSDN@Home 1.1.4 beta 4 rev. 347>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[10]: Активные объекты в С++
    От: А почему вы спрашиваете Беларусь  
    Дата: 23.03.05 13:32
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Здравствуйте, Gaperton, Вы писали:


    G>>Считать или нет операцию асинхронной посылки сообщения и блокирующую синхронную операцию получения сообщения примитивами синхронизации — вопрос глубоко философский .

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

    Понятие сообщения в эраланговской модели неделимо и "аксиоматично", если угодно. Куда уж атомарней-то?
    Re[18]: Активные объекты в С++
    От: Gaperton http://gaperton.livejournal.com
    Дата: 23.03.05 14:17
    Оценка:
    Здравствуйте, А почему вы спрашиваете, Вы писали:

    АПВ>>>Я понимаю, что Вас смущает. Вас смушает, что сообщения — это не только и не столько синхронизация, так? Думаю, что здесь нет никакой проблемы. Сообщения — примитивы межпроцессного взаимодействия, синхронизация — частный случай межпроцессного взаимодействия, следовательно сообщения — примитивы синхронизации в том числе.


    G>>Вот я и говорю — глубокий философский вопрос . Давайте поговорим об этом. Вам должно быть известно, что любой примитив синхронизации выразим через семафор (Дейкстра). Попробуйте сделать это с сообщениями . Как вы думаете — получится?


    АПВ>Думаю получится. Достаточно реализовать семафор. Сделать это, как вы сами догадываетесь, несложно. Сделаем процесс semaphore_server. Дальше надо рассказывать?


    Не надо. Если сообщение — примитив синхронизации, то оно, как и любой примитив синхронизации, должен быть выразим через семафор, как показал Дейкстра. Так что достаточно выразить сообщения через семафоры .

    На самом деле, вопрос получился глубоко филосовским по одной причине — не оговорено точное определение примитива синхронизации.
    Re[11]: Активные объекты в С++
    От: Gaperton http://gaperton.livejournal.com
    Дата: 23.03.05 14:26
    Оценка:
    Здравствуйте, А почему вы спрашиваете, Вы писали:

    АПВ>Здравствуйте, Sinclair, Вы писали:


    S>>Здравствуйте, Gaperton, Вы писали:


    G>>>Считать или нет операцию асинхронной посылки сообщения и блокирующую синхронную операцию получения сообщения примитивами синхронизации — вопрос глубоко философский .

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

    АПВ>Понятие сообщения в эраланговской модели неделимо и "аксиоматично", если угодно. Куда уж атомарней-то?

    В рамках борьбы со флеймом, выложу сюда лог аськи. Штоб все знали, чего от тебя ждать, негодяя .

    dbg (3:51 PM) :
    ответил
    Vlad (4:14 PM) :
    Хреново ответил Сообщения через семафоры надо было выражать
    Vlad (4:14 PM) :
    Я тут такие сети расставил, а ты вопрос не понял
    Vlad (4:14 PM) :
    Обидно, слушай
    dbg (4:15 PM) :
    зачем? но если очень хочется, то можно, но _очень_ через жопу.
    dbg (4:15 PM) :
    ну переформулируй вопрос, может еще попадусь.
    Vlad (4:15 PM) :
    Затем, что если сообщение — примитив синхронизации, то оно, как и любой примитив синхронизации, должен быть выразим через семафор, как показал Дейкстра
    Vlad (4:16 PM) :
    Здесь ловушка — значение термина "примитив синхронизации".
    Vlad (4:16 PM) :
    Что это все-таки такое?
    dbg (4:17 PM) :
    ааа. ну ты сформулировал очень неоднозначно. я имел полное право не понять.
    dbg (4:18 PM) :
    средство синхронизации — это то с помошью чего можно синхронизироваться. вот и все. примитивность в данном случае — это "аксиоматичность", т.е. мы строим средства синхронизации из этих "аксиоматических" средств.
    dbg (4:19 PM) :
    кстати, разве это был дейкстра, а не хоар?
    Vlad (4:19 PM) :
    Ну да. Вилка — орудие убиства.
    Vlad (4:19 PM) :
    По моему, дейкстра — он рахработал теорию параллельных процессов.
    Vlad (4:19 PM) :
    Хз.
    dbg (4:20 PM) :
    ну да. в контексте пыряния в пузо, натурально, орудие. чего уж тут.
    Vlad (4:20 PM) :
    Но вилка — не оружие.
    dbg (4:20 PM) :
    ну, ты зачем-то выдвигаешь требование built for purpose. зачем оно тебе?
    Vlad (4:21 PM) :
    Затем, что с общепринятым примитивом синхронизации ты ничего не сделаешь, кроме main purpose.

    А сообщения это просто транспорт — это совершенно different kind of animals.
    dbg (4:22 PM) :
    да ну? не сделаю? и subliminal channel на паре семафоров не построю?
    Vlad (4:22 PM) :
    А что это такое?
    dbg (4:23 PM) :
    штирлиц увидел на окне сорок горшков с геранью и рояль, прибитый к потолку. штирлиц понял, что явка провалена. этот способ коммуникации называется subliminal channel
    dbg (4:25 PM) :
    рассказывать, как соорудить канал передачи данных на семафорах, не надо?
    Vlad (4:26 PM) :
    Охренеть. Передай мне строку от процесса к процессу через семафор.

    Смотри.

    У тебя есть сообщения. У тебя есть семафор. Ты сможешь собрать семафор на сообщениях. От этого свойства семафора не переходят на его составные элементы — сообщения (потому, что есть еще протокол и алгоритм).
    dbg (4:27 PM) :
    как передать один бит, надо рассказывать?
    Vlad (4:39 PM) :
    Причем тут бит
    Vlad (4:39 PM) :
    Ну расскажи
    Vlad (4:40 PM) :
    Тока штоб буфер сообщений был, и они асинхронно отправлялись
    dbg (4:40 PM) :
    ты издеваешься?
    как причем? передадим один бит, передадим другой, а там, глядишь, и трока пролезла.
    Vlad (4:40 PM) :
    Буфер где?
    Vlad (4:40 PM) :
    Где асинхронность?
    Vlad (4:41 PM) :
    Естественно, можно передавать информацию через семафор. Если бы он не давал утечки информации, его и для синхронизации нельзя было бы использовать
    dbg (4:41 PM) :
    дык.
    dbg (4:43 PM) :
    но это все пустопорожнее. ты требуешь от меня доказать подменный тезис.
    никто, и в первую очередь дейкстра ,не говорил что все примитивы синхронизации выразимы через семафор. этот тезис правильно формулируется так: "все _задачи_ синхронизации решаются с помощью семафоров".
    dbg (4:45 PM) :
    соотвественно, все задачи сихронизации могут быть решены и с помощью сообщений. с этом смысле сообщение — это, определенно, примитив синхронизации.
    Vlad (5:06 PM) :
    Сообщение — примитив обмена информацией. Синхронизация — частный случай обмена информацией.
    Vlad (5:07 PM) :
    Задача синхронизации одной посылкой сообщения не решить. Тебе нужен
    1) Протокол обмена
    2) Алгоритм.
    Vlad (5:07 PM) :
    Выводы. Алгоритмы — средства синхронизации.
    Vlad (5:07 PM) :
    Протоколы — тоже средства синхронизации.
    dbg (5:08 PM) :
    ну конечно. раз сообщение решает _все_ проблемы обмена, то следовательно, сообщение — примитив и синхронизации тоже.
    Vlad (5:08 PM) :
    Все по твоей логике. Смысла много в таких утверждениях?
    dbg (5:10 PM) :
    нет, не много. непонятно откуда взялось решить проблему _одной_ посылкой. не все проблемы синхронизации решаются _один_ семафором. нужет протокол и алгоритм. так что теперь и семафор — не примитив синхронизации?
    Vlad (5:12 PM) :
    Тем не менее, один семафор (и другие примитивы синхронизации — их много) решает вполне конкретную проблемы синхронизации.
    Vlad (5:12 PM) :
    А одно сообщение — нет.
    Vlad (5:13 PM) :
    Ладно, скажи — RPC-вызов — примитив синхронизации?
    Vlad (5:13 PM) :
    RPC совершенно эквивалентен сообщениям.
    dbg (5:14 PM) :
    почему нет?
    можно синхронизироваться (скоординироваться во времени)? можно. значит это средство синхронизации. примитив? ну если в некоторой модели — это атомарно, неделимое событие, то да примитив.
    Vlad (5:15 PM) :
    На то, кстати, семафор и "примитив", что он _один_ решает проблему синхронизации. Но это совсем не "примитив" передачи информации , черта лысого ты ее так просто передашь.

    А сообщение — примитив передачи информации, но далеко не "примитив" синхронизации — в один ход ты ничего не синхронизируешь.


    Vlad (5:16 PM) :
    Короче, терминологический спор. Зануда ты.
    dbg (5:18 PM) :
    ну да, зануда. а ты кто?
    впрочем, о пустом спорим. я влез в дискуссию только по одному поводу. это когда ты начал рассказывать, что эрлангу проблемы синхронизации чужды, потому что у него есть сообщения и нет общей памяти. но с этим мы вроде порешили.
    Vlad (5:18 PM) :
    С этим — да, я пропустил случай распределенных транзакций.

    Re[12]: Активные объекты в С++
    От: А почему вы спрашиваете Беларусь  
    Дата: 23.03.05 14:33
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>Здравствуйте, А почему вы спрашиваете, Вы писали:


    АПВ>>Здравствуйте, Sinclair, Вы писали:


    S>>>Здравствуйте, Gaperton, Вы писали:


    G>>>>Считать или нет операцию асинхронной посылки сообщения и блокирующую синхронную операцию получения сообщения примитивами синхронизации — вопрос глубоко философский .

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

    АПВ>>Понятие сообщения в эраланговской модели неделимо и "аксиоматично", если угодно. Куда уж атомарней-то?

    G>В рамках борьбы со флеймом, выложу сюда лог аськи. Штоб все знали, чего от тебя ждать, негодяя .

    G>

    ...


    Ай-ай-ай, падонак. Раскрыл инкогнитО. Я бы еще пару дней понудел бы.
    Re[10]: Активные объекты в С++
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 23.03.05 14:34
    Оценка:
    Здравствуйте, RailRoadMan, Вы писали:

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


    И наоборот.

    Synchonization Examples

  • Readers and Writers
  • Signals
  • Re-entrant Locks
  • Binary and Generic Semaphores
  • Barrier
  • Bounded Buffer

  • http://bluebottle.ethz.ch/languagereport/node8.html

    Что первично: курица или яйцо?
    Re[11]: Активные объекты в С++
    От: RailRoadMan  
    Дата: 23.03.05 15:27
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Здравствуйте, RailRoadMan, Вы писали:


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


    СГ>И наоборот.


    СГ>

    СГ>Synchonization Examples
    СГ>

  • Readers and Writers
    СГ>
  • Signals
    СГ>
  • Re-entrant Locks
    СГ>
  • Binary and Generic Semaphores
    СГ>
  • Barrier
    СГ>
  • Bounded Buffer

  • СГ>http://bluebottle.ethz.ch/languagereport/node8.html

    СГ>Что первично: курица или яйцо?


    Так может они и не такие уж и "понятия уровня проектирования" ?
    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&amp;only=1
    Автор: Gaperton
    Дата: 23.03.05

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