Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разработка многопоточных объектно-ориентированных, совместимы ли ООП и многопоточность?  
:(
    Опции темы
Lukkoye
Дата 3.4.2014, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: 1
Всего: 1



Цитата(baldina @  3.4.2014,  00:28 Найти цитируемый пост)
на С все возможно, только многословнее. raii особенно удобен в среде с исключениями, но в С нет исключений, и в этом смысле проблем меньше.
raii часто ошибочно связывают с ООП, но фактически к ООП он не относится. просто некоторые средства некоторых языков с поддержкой ООП позволяют это изящно реализовать. 


На сях можно написать язык, который сможет блекджек и компанию.
Но на самих сях нельзя реализовать автоматику raii.

Грубо говоря, на сях не получится сделать автоматику, которая самостоятельно освободит указатель, как только закончится его область видимости.

И если вы сами явно где нибудь не дернете free, сишный мьютекс так и не пустит поток.




PM MAIL   Вверх
Фантом
Дата 3.4.2014, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Цитата(Lukkoye @  3.4.2014,  23:31 Найти цитируемый пост)
Грубо говоря, на сях не получится сделать автоматику, которая самостоятельно освободит указатель, как только закончится его область видимости.

У С все хорошо с полнотой языка, поэтому сделать на нем получится все. Другой вопрос, какой ценой.
PM   Вверх
Lukkoye
Дата 3.4.2014, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: 1
Всего: 1



Цитата(Фантом @  3.4.2014,  22:32 Найти цитируемый пост)
У С все хорошо с полнотой языка, поэтому сделать на нем получится все. Другой вопрос, какой ценой. 


Ну покажите мне, как на pure C реализовать автоматический захват ресурса - допустим, выделить память под структуру.
А потом, когда закончится время жизни указателя - автоматически освободит ресурс.





PM MAIL   Вверх
baldina
Дата 3.4.2014, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Lukkoye, если трактовать raii как паттерн, исключительно основанный на автоматическом вызове конструктора/деструктора, то да. ближе к ООП он от этого не становится
PM MAIL   Вверх
Lukkoye
Дата 3.4.2014, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: 1
Всего: 1



Цитата(Alexeis @  3.4.2014,  16:59 Найти цитируемый пост)
Объект B унаследовал все из объекта А, и дополнил его новым полем b;


Вы путаете наследование и агрегирование.
Наследования на pure C не существует.


PM MAIL   Вверх
baldina
Дата 3.4.2014, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(Lukkoye @  3.4.2014,  22:38 Найти цитируемый пост)
Ну покажите мне, как на pure C реализовать автоматический захват ресурса - допустим, выделить память под структуру.
А потом, когда закончится время жизни указателя - автоматически освободит ресурс

надо просто создать дополнительный контекст, владеющий ресурсом. с точки зрения внутренней функции use() все происходит автоматически 
Код

Type* construct () {
    Type *obj = malloc (sizeof(Type));
        ...
    return obj;
}

void destruct (Type *obj) {
  ...
  free (obj);
}

void use (Type* obj) {
    // do something with obj
}

void own () {
    Type *obj = construct ();
    use (obj);
    destruct (obj);
}


Добавлено через 3 минуты и 12 секунд
естественно, можно написать более изощренный пример, позволяющий use() влиять на создание объекта. только это многословней

Это сообщение отредактировал(а) baldina - 3.4.2014, 22:56
PM MAIL   Вверх
Lukkoye
Дата 3.4.2014, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: 1
Всего: 1



Цитата(baldina @  3.4.2014,  22:40 Найти цитируемый пост)
если трактовать raii как паттерн, исключительно основанный на автоматическом вызове конструктора/деструктора, то да. ближе к ООП он от этого не становится 


Я не совсем понимаю фразу "трактовать raii как паттерн".

Слово "паттерн" я понимаю, как "решение", которое наиболее практичным образом решает некоторую проблему.

raii (Resource Acquisition Is Initialization) я понимаю, как идеому: получение ресурса - есть инициализация.

Суть которой - автоматический захват ресурса, и автоматическое же его освобождение.

Из этого вытекает важнейшее следствие: раии-механизмы позволяют простым способом контролировать вопросы владения и времени жизни объектов.

Собственно это главное и единственное, что вообще требуется от raii.

При этом raii - это не только автоматические вызовы конструкторов/диструкторов.

У этой концепции есть более широкая область применения.

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

Для этого ресурсы системы создаются и хранятся по факту внутри самой системы.
Только система знает как создать и как прибить ресурс.

Когда пользователь запрашивает ресурс - система создает его внутри себя. И заряжает шаред-указатель уже реально существующим объектом.
Так же, она устанавливает шаред-указателю функцию, которую тот автоматически вызовет, когда закончатся ссылки на него.

Таким образом, ресурсы по факту живут внутри системы, где она может гарантировать их целостность.
И ей не нужно самостоятельно пасти - использует ли их кто ещё снаружи.

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


Резюмируя: идеома raii - это идея, как можно очень легко и просто контролировать вопросы владения и времени жизни объектов.

Добавлено через 1 минуту и 29 секунд
Цитата(baldina @  3.4.2014,  22:55 Найти цитируемый пост)
надо просто создать дополнительный контекст, владеющий ресурсом. с точки зрения внутренней функции use() все происходит автоматически 


Я просил автоматику.

Меня не интересует точка зрения функции use
Меня интересует точка зрения программиста, которому нужно вручную дергать 

construct (obj);
destruct (obj);

И не дай боже этого забывать.

Это ни разу не автоматика.
PM MAIL   Вверх
baldina
Дата 3.4.2014, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(Lukkoye @  3.4.2014,  23:06 Найти цитируемый пост)
Меня не интересует точка зрения функции use
Меня интересует точка зрения программиста, которому нужно вручную дергать 

программист пишет только use(). внешнюю функцию написали за него и для него (или он сам, в рамках решения не прикладной задачи, а подготовки низкоуровневого слоя). ясно, что в С где-то придется вызвать вручную.

название "raii" это идиома. raii в отношении к с++ это паттерн. в отношении к любым языкам - это концепция единственного владельца ресурса. и вот эту концепцию можно реализовать в любом языке

Это сообщение отредактировал(а) baldina - 3.4.2014, 23:22
PM MAIL   Вверх
Lukkoye
Дата 3.4.2014, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: 1
Всего: 1



Цитата(baldina @  3.4.2014,  23:21 Найти цитируемый пост)
программист пишет только use(). внешнюю функцию написали за него и для него (или он сам, в рамках решения не прикладной задачи, а подготовки низкоуровневого слоя). ясно, что в С где-то придется вызвать вручную.


У вас последнее предложение противоречит первому.
Кто-то вручную должен написать construct и destruct.

Это уже не автоматика. 
И если ближе к реальной практике, то весь pure C - это один сплошной низкоуровневый слой.

Для сишника - выделить память, чем то её заполнить, а потом освободить - это обычная рутинная работа.
И сишник знает - кроме него самого, никто это это за него не сделает.
И ни одна сишная программа без этого не обходится.


Цитата(baldina @  3.4.2014,  23:21 Найти цитируемый пост)

название "raii" это идиома. raii в отношении к с++ это паттерн. в отношении к любым языкам - это концепция единственного владельца ресурса. и вот эту концепцию можно реализовать в любом языке


Вот мне не понятно: в отношении к с++, как понять "raii -это паттерн" ?
PM MAIL   Вверх
k0rvin
Дата 4.4.2014, 07:12 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(baldina @  3.4.2014,  22:55 Найти цитируемый пост)
надо просто создать дополнительный контекст, владеющий ресурсом. с точки зрения внутренней функции use() все происходит автоматически

Как вариант:

Код

#include <u.h>
#include <libc.h>

typedef int T;

T *
Tnew(T init)
{
    T *v;
    v = malloc(sizeof(T));
    if (v == nil)
        return nil;
    *v = init;
    print("created: %d\n", init);
    return v;
}

void
Tdestroy(T *v)
{
    print("destroying: %d\n", *v);
    free(v);
}

#define WITH(type, var, init, body) {\
    type * var = type##init;\
    if (var != nil) body;\
    type##destroy(v); }

void
main(void)
{
    WITH(T, v, new(1), {
        print("Hello ");
        print("%d\n", *v);
    });
    exits(0);
}


Код

~/prog/c $ ./with
created: 1
Hello 1
destroying: 1
~/prog/c $ 


Только 1) нужно придерживаться определенного соглашения и 2) при возникновении аварийной ситуации (сегфолт например) внутри body, деструктор не вызовется (насколько я понимаю).


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
borisbn
Дата 4.4.2014, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



k0rvin, awesome !
Лямбда ни Си. ЗдОрово !

Это сообщение отредактировал(а) borisbn - 4.4.2014, 10:25


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Фантом
Дата 4.4.2014, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Цитата(Lukkoye @  3.4.2014,  23:38 Найти цитируемый пост)

Ну покажите мне, как на pure C реализовать автоматический захват ресурса - допустим, выделить память под структуру.


Цитата(Lukkoye @  4.4.2014,  00:06 Найти цитируемый пост)

Я просил автоматику.

Меня не интересует точка зрения функции use
Меня интересует точка зрения программиста, которому нужно вручную дергать 

Ну что ж, в таком случае есть универсальный ответ: на C можно написать компилятор C++. Исходные коды приводить не будем ввиду их объемности.  smile 
PM   Вверх
k0rvin
Дата 4.4.2014, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Фантом @  4.4.2014,  10:29 Найти цитируемый пост)
Ну что ж, в таком случае есть универсальный ответ: на C можно написать компилятор C++.

О чем Lukkoye уже сказал здесь.

Это сообщение отредактировал(а) k0rvin - 4.4.2014, 10:42


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Фантом
Дата 4.4.2014, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Цитата(k0rvin @  4.4.2014,  11:41 Найти цитируемый пост)

О чем Lukkoye уже сказал здесь.


Ага. Но вот где проходит граница между "можно реализовать на самом языке" и "нельзя реализовать на самом языке" - вопрос открытый. 

Очевидно, что если можно написать компилятор, то можно и интерпретатор, а это означает, что все те же средства принципиально возможно приделать и к программе на C. Следовательно, имеет смысл обсуждать только вопрос о том, насколько это удобно.
PM   Вверх
Lukkoye
Дата 4.4.2014, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: 1
Всего: 1



Цитата(Фантом @  4.4.2014,  11:21 Найти цитируемый пост)

Ага. Но вот где проходит граница между "можно реализовать на самом языке" и "нельзя реализовать на самом языке" - вопрос открытый.


На самом языке - на уровне исходного текста программ, которые пишутся на этом языке


Пример:

с++2003 стандарт не поддерживает оператор decltype. В коробке с гцц идет в поставке оператор typeof, но лишь, как расширение от компилятора.
Стандартного средства не существовало.

Реализовать самодельный typeof кросскомпиляторно, который предоставлял бы полную автоматику (как decltype) было не возможно.

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

Код

...
struct some 
{ 

    enum { eTYPEOF = 1 }; //уникальный идентификатор типа, 
     //который нужно писать в ручную. И в ручную же пасти его уникальность.
... 

};

...
REGISTER(some); // <--- макрос, который использует шаблоны, для ассоциации числового идентификатора с типом
...

some obj1;

typeof(obj2) obj1; // <--- макрос, который вытряхнет из объекта идентификатор,
 //по которому можно будет построить шаблон, который вернет результат typedef на тип obj1

// эквивалентная запись получится:
//
// some obj2;

...


Ну так вот, с++11 decltype - это технология новых компиляторов.
Программист может пользоваться и не геммороится о том, кто и как ему эту возможность обеспечивает.

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

Итого: 
с++03 не поддерживает технологию decltype , и реализовать её в полноценном виде на языке невозможно. Можно сделать лишь сильно ограниченные костыли-велосипеды.
с++11 поддерживает технологию из коробки. Программист может просто пользоваться и не париться.



Это сообщение отредактировал(а) Lukkoye - 4.4.2014, 13:42
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.