1 2 3 4
Активные объекты в С++ в избранное  новое горячее всё    подписка   модер. 
От: Сергей Губановhttp://sergey-gubanov.livejournal.com/
Дата: 21.03.05 09: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 09:39
Сергей Губанов пишет:

> *Статья:*

> Активные объекты в С++ <http://qnxclub.net/files/articles/ao/ao.html>
> Библиотека эмуляции активных объектов на *С++* в духе *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. Nonehttp://mrnone.blogspot.com
Дата: 21.03.05 10:00
Оценка:4 (3)
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Статья:

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

СГ>Автор:

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

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

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

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

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

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

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

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

СГ>Статья:

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

СГ>Автор:

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

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

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

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

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


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

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


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


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

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


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


Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[2]: Активные объекты в С++ в избранное  новое    модер. 
От: Сергей Губановhttp://sergey-gubanov.livejournal.com/
Дата: 21.03.05 11: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 11:48
    Оценка: -1 :)
    Здравствуйте, eao197, Вы писали:

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


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

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

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

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

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

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


    Ну ладно, умолкаем, мы все тут такие не грамОтные академиев не кончали, пишем себе с заморочками присущими не ОО системам. И енти самые ОО системы очевидно только для избранных и понять нам их не дано...
    Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
    Re[3]: Активные объекты в С++ в избранное  новое    модер. 
    От: eao197http://eao197.blogspot.com
    Дата: 21.03.05 12: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 12:12
    Здравствуйте, Cyberax, Вы писали:

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

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

    Вы еще скажите что между структурой в языке Си и классом в языке С++ тоже разницы нету. Естественно, что на низком уровне все устроено одинаково, а уж на уровне машинных команд разницы вообще нет. Разница она на более высоком уровне абстракции. Такая сущность как активный объект сводит всю сложную проблему синхронизации процессов+потоков всего лишь к трем понятиям: EXCLUSIVE, AWAIT, ACTIVE, все остальное выводится из них. С другой стороны, эффективно реализовать инструкцию AWAIT в не ОО системе или нереально (большая нагрузка на CPU в бесконечных циклах ожидания на каждый поток) или небезопасно (слишком велика вероятность ошибки программиста приводящих к странным и непонятным зависаниям и т.п. где-то забыл Monitor.PulseAll() написать, где-то лишний раз написал...).
    Re[3]: Активные объекты в С++ в избранное  новое    модер. 
    От: Mr. Nonehttp://mrnone.blogspot.com
    Дата: 21.03.05 12: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]: Активные объекты в С++ в избранное  новое    модер. 
    От: Трурльwww.trurl.ru
    Дата: 21.03.05 12:19
    Здравствуйте, Cyberax, Вы писали:

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


    А почему не "обычный процесс"?
    Re[4]: Активные объекты в С++ в избранное  новое    модер. 
    От: Mr. Nonehttp://mrnone.blogspot.com
    Дата: 21.03.05 12: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 12: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 12:36
    Здравствуйте, Трурль, Вы писали:

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


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


    Потому что в системах типа Windows процесс содержит не менее одного потока. В последней Обероновой войне, где речь шла о защите памяти, можно найти подробности. Вкратце — все активные объекты Оберона выполняются в общем адресном пространстве, т. е. в терминологии Windows это — потоки.
    Re[5]: Активные объекты в С++ в избранное  новое    модер. 
    От: Cyberax 
    Дата: 21.03.05 12: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 12: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 13:47
    Оценка: -3
    Здравствуйте, Mr. None, Вы писали:

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


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

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

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

    А причем тут "системы типа Windows" ?
    1 2 3 4