Страница 1 из 2

Многопоточность Loki::SmartPtr<...>

Добавлено: 22 сен 2005, 19:24
Lev
Дело в том что у меня проблемма со стратегией OwnershipPolicy.
RefCounted, заданная по умолчанию работает прекрасно, но если включаю RefCountedMT то компилятор начинает ругаться:
error C3201: the template parameter list for class template 'Loki::RefCountedMT' does not match the template parameter list for template parameter 'OwnershipPolicy'
(...)\Programing\Libraries\My\CmnHdr.h(17) : see reference to class template instantiation 'BaseSmrtPtrString<T>' being compiled

и указывает на мой класс, который выглядит так:

template<typename T>
class BaseSmrtPtrString :
public Loki::SmartPtr<T,Loki::RefCountedMT>
{

};
если в этом классе поставить RefCounted вместо RefCountedMT то всё прекрасно проходит. Но мне нужно RefCountedMT т.к. у меня многопоточное приложение и мне не хочется следить за указателями используя RefCounted.
Помогите пожайлуста.

Добавлено: 23 сен 2005, 10:50
Absurd
Пробовал четать сорц?

////////////////////////////////////////////////////////////////////////////////
// class template RefCountedMT
// Implementation of the OwnershipPolicy used by SmartPtr
// Implements external reference counting for multithreaded programs
// Policy Usage: RefCountedMTAdj<ThreadingModel>::RefCountedMT
////////////////////////////////////////////////////////////////////////////////

template <template <class> class ThreadingModel>
struct RefCountedMTAdj

То есть надо писать что-то типа Loki::SmartPtr<T,Loki::RefCountedMTAdj<Loki::ClassLevelLockable>::RefCountedMT >

Библиотекой пользуюсь, прикольная вещь.

Добавлено: 23 сен 2005, 18:36
Lev
Пробовал. Но у меня написано в файле SmartPtr.h начиная со строки 153 только:

////////////////////////////////////////////////////////////////////////////////
// class template RefCountedMT
// Implementation of the OwnershipPolicy used by SmartPtr
// Implements external reference counting for multithreaded programs
////////////////////////////////////////////////////////////////////////////////
template <class P,
template <class> class ThreadingModel>
class RefCountedMT : public ThreadingModel< RefCountedMT<P, ThreadingModel> >
{

и далее...

Значит у меня библиотека битая. У неё // Last update: June 20, 2001
Ссылку на нормальную библиотеку можно?
И вообще на сайте такие вещи хранить(выложить) удобно было бы.

Добавлено: 23 сен 2005, 18:53
Absurd

Добавлено: 23 сен 2005, 19:20
Lev
Всё, скачал новую прямо с сайта производителя, спасибо за помощь. Сейчас буду осваивать. Компилятор даже перестал warning выдавать как он делал это с предидущей библиотекой.
На другом форуме мне сказали:
Я бы не советовал использовать Локи, как полноценную библиотеку. Её можно рассматривать, как пособие и примеры по Moderт С++ Design. Для реальных же проектов лучше использовать Boost.
что Вы скажете об этом?

Добавлено: 25 сен 2005, 18:44
Absurd
Мы? Какие-то аргументы были в поддержку процитированного мнения? Поскольку Вы не включили их в цитату, Мы склонны полагать что их не было.
Буст тяжеловесный - он тащит за собой весь CRT который может унести. Loki легковесная - у меня есть подозрение, что ее и вовсе можно отучить от CRT. Она пытается зацепиться за CRT в двух местах - в плане кидания std:: исключений и юзания С++ RTTI. Исключения из std:: можно удалить при помощи скальпеля, поменяв их на SEH исключения win32. RTTI используется, если мне не изменяет память, в Loki::Visitor и Loki::Multimethod. Во-первых это очень крутые вещи - в буст ни визитора ни мультиметода нет. Во - вторых Мы за всю свою программистскую практику не доросли до использования этих паттернов. А в третьих вместо C++ RTTI можно попытаться как-то использовать специфичные для библиотек windows аналоги этой функциональности.

Добавлено: 26 сен 2005, 12:19
Lev
Аргументы на том форуме были приведены позже, когда я спросил "почему?":
Loki - это довольно сырая библиотека, разрабатываемая просто как система примеров.
Это мнение моё и многих, кто имел с ней дело.

Boost создавался, как то что не вошло в стандарт по тем или иным причинам. Используется многими и давно. Имеет положительную репутацию.
Да, мне нравиться Loki за то что он легковесен. Автору действительно удалось написать такой относительно малый код и получить много разнообразных вещей, путём комбинации.
Я пока пользуюсь только Loki::SmartPtr<...>. Т.к. меня всегда "бесила" надобность самому следить за моментом применения "delete ptr". Loki::SmartPtr<...> здесь очень выручает. Конечно помедленнее работать стало, но для моих приложений это то что нужно. Естественно где-то и нужно вручную использовать delete (быстродействие), но я пока обхожусь и таким автоматичаским способом.

Добавлено: 26 сен 2005, 12:59
Absurd
Loki - это довольно сырая библиотека, разрабатываемая просто как система примеров.
Это мнение моё и многих, кто имел с ней дело.

Boost создавался, как то что не вошло в стандарт по тем или иным причинам. Используется многими и давно. Имеет положительную репутацию.
Don Clungston на sourceforge.net рассказывал про серьезный проект написанный с плотным использованием буста. Там половина кучи была использована под мелкие объекты типа счетчика ссылок к boost::shared_ptr или под мелкие полиморфные объекты типа переходника в boost::function. Loki эти дела хотя бы размещает в специальном спуле памяти оптимизированным для мелких объектов. Это по поводу сырости.

Кроме SmartPtr рекоммендую Loki::Singleton для сервисов и Loki::Functor для каллбэков

Добавлено: 26 сен 2005, 13:10
Eugie
Господа, а почему незаслуженно забыт стандартный auto_ptr? IMHO, тащить библитотеку, даже легкую как Loki, только для смарт-указателей - ну, как-то расточительно, что-ли.

Добавлено: 26 сен 2005, 15:28
Absurd
Eugie писал(а):Господа, а почему незаслуженно забыт стандартный auto_ptr?
К Loki::SmartPtr можно подключить политику владения "Loki::DestructiveCopy" тогда он будет повторять auto_ptr. А можно и Loki::ComRefCounted. Тогда он будет считать COM ссылки. Причем эти политики статические, и существуют они только в момент компиляции, не влияя на производительность.