Класс Cntm::SynchroObject
[Cntm.Synchro]

Граф наследования:Cntm::SynchroObject:

Cntm::IBasicSynchro Cntm::IRefObject Cntm::SynchroAggregatedBase Cntm::SynchroRefBase Cntm::SynchroRefBaseEx Cntm::ActiveSynchroRefBase Cntm::ActiveSynchroRefBaseEx

Полный список членов класса


Подробное описание

Базовый класс для синхрообъектов.

Для того, чтобы создать свой класс синхрообъекта, его нужно унаследовать от классов Cntm::SynchroRefBase, Cntm::SynchroRefBaseEx или Cntm::SynchroAggregatedBase (эти объекты добавляют класс Cntm::SynchroObject как примесь к соответствующей реализации подсчета ссылок).

Синхрообъекты - это объекты со встроенными средствами синхронизации. Синхрообъект обязательно принадлежит определенному синхропространству (см. класс Cntm::SynchroSpace). Синхропространство задается при создании объекта и впоследствии не меняется.

Одна из важнейших функций синхрообъекта в многопоточных приложениях - эксклюзивный вход в синхропространство для выполнения действий, требующих синхронизации (т.е. они не должны быть прерваны другими действиями). Синхропространство в данном случае выступает как критическая секция или мьютекс, единая для всех объектов, принадлежащих синхропространству. Вход и выход из синхропространства выполняются методами Enter(), TryEnter() и Leave() или с помощью классов Cntm::Sync и Cntm::ReentrantSync (рекомендуется использовать классы, т.к. они повышают удобство и надежность). Вызов методов ...Enter() и Leave() аналогичен вызову соответствующих методов синхропространства. Процедуры входа в синхропространство рекурсивны. Принципы синхронизации описаны в классе Cntm::SynchroSpace.

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

 void Method1(int Arg)
 {
 Sync s(*this); // Точка входа в синхропространство до конца метода.
 ...
 }

Дополнительно синхрообъект предоставляет методы для запуска асинхронных отложенных процедур (метод Defer()()) и асинхронных потоковых процедур (метод Thread()()). Асихронный означает, что поток выполнения не ожидает конца запущенной процедуры, а продолжает работу сразу же после запуска. Отложенная процедура - это подготовленный вызов метода объекта (т.е. с указанием аргументов, которые будут переданы методу при вызове), который будет выполнен, когда будет возможен очередной вход в синхропространство. Асинхронные отложенные процедуры описаны в классе Cntm::AsyncProc. Реально отложенные процедуры реализованы через механизм отложенных синхрозаданий, описанный в документации по классу Cntm::SynchroSpace. Отложенные процедуры могут использоваться для синхронизированного вызова методов из разных потоков выполнения без входа в синхропространство. Асинхронная потоковая процедура - это метод объекта, который выполняется в отдельном потоке. Потоковые процедуры также позволяют передавать любые аргументы в метод, который будет выполняться в отдельном потоке. Асинхронные потоковые процедуры описаны в классе Cntm::AsyncProc. Пример (асинхронный подсчет кол-ва слов в тексте):

 class Class1: public SynchroRefBase
 {
 int CalcWordsCount(const string& Text, const string& Delims) { ... return res; }
 
 void Main()
 {
 string txt; cin >> txt;
 AsyncProcResult<int> res = ThreadProc(&Class1::CalcWordsCount)(txt, " .,;:!?"); // Создание потока, выполняющего CalcWordsCount и передача ему текста txt и символов-разделителей.
 ... // Выполнение каких либо полезных действий, например запись текста в файл.
 cout << "Кол-во слов = " << res; // Вывод кол-ва слов на экран.
 }
 };

При использовании синхрообъектов повышается удобство подключения к отложенным событиям (класс Cntm::DeferEvent) и вызов асинхронных отложенных процедур (методы Cntm::AsyncProc::Defer()()). Для работы этих средств требуется указание синхропространства, т.к. для синхрообъектов оно определено изначально, то нет нужды явно его указывать.

Синхронное создание объектов. Вызов конструктора синхрообъекта должен происходить внутри синхропространства, поэтому перед инициализацией объекта следует войти в то пространство, которому будет принадлежать объект. В качестве параметра конструктору передается синхропространство, к которому будет принадлежать объект. Имеется две формы конструкторов SynchroObject:

Рекомендации по конструкторам пользовательских классов синхрообъектов. Если в системе используется только главное синхропространство, то никаких параметров использовать не нужно, объект автоматически будет принадлежать главному синхропространству. Если гарантируется, что объект будет создан внутри того синхропространства, к которому он будет принадлежать (обычно это внутренние объекты), то следует использовать только первую форму конструктора с явным указанием синхропространства. Если объект создается из произвольного синхропространства (в т.ч. из нового), то следует использовать вторую форму (возможно выбрав какую-то одну секцию, например, Sync). Если предполагается универсальное использование класса, то следует предоставить обе формы конструкторов (соответственно, три типа конструкторов). Примеры классов:

 // Класс, который создается в указанном синхропространстве.
 class Class1: public SynchroRefBase
 {
 public:
 typedef RefPtr<Class1> Ptr;
 Class1(const SynchroSpace::Ptr& Space = SynchroSpace::Ptr()): SynchroRefBase(Space) {}
 };
 
 // Использование.
 ...
 Class1::Ptr c1 = new Class1; // Главное синхропространство.
 ...
 Class1::Ptr c2 = new Class1(this->Space()); // Явно указанное синхропространство, в него должен быть произведен вход перед использованием.
 ...
 
 // Класс, который создается в произвольном синхропространстве. Класс не использует реентерабельный вход, поэтому ограничимся только одной синхросекцией - Cntm::Sync.
 class Class2: public SynchroRefBase
 {
 public:
 typedef RefPtr<Class2> Ptr;
 Class2(Sync& ConstructSync): SynchroRefBase(ConstructSync) {}
 };
 
 // Использование.
 ...
 Sync s;
 Class2::Ptr c3 = new Class2(s); // Создает дополнительное синхрпространство, производит в него вход (заполняя s).
 // На момент выхода из конструктора s будет содержать новое дополнительное синхропространство.
 ...
 Sync is(parent->Space()); // Войти в синхропространство.
 Class2::Ptr c4 = new Class2(is); // Объект будет создан в синхропространстве parent->Space().
 ...

Синхронное уничтожение объектов. Подразумевает, что вызов деструкторов для классов Cntm::SynchroRefBase и Cntm::SynchroRefBaseEx и виртуального метода Cntm::SynchroRefBaseEx::OnReleaseInstance() будет производится отложенно синхронно по правилам для отложенных процедур или событий (см. выше) через механизм отложенных синхрозаданий (см. класс Cntm::SynchroSpace). Это значит, что вызов методов деинициализации будет происходить не в тот момент, когда будет утеряна последняя ссылка на объект, а когда можно будет осуществить отложенный синхронный вход в синхропространство, к которому принадлежал объект.

Данный класс обеспечивает многопоточность.

Автор:
Овсеевич Р.

См. определение в файле SynchroObject.h строка 108


Открытые типы

typedef RefPtr
< SynchroObject
Ptr

Открытые члены

SynchroSpace::Ptr Space () const
 Возвращает синхропространство, к которому принадлежит синхрообъект.
bool IsReentrantMode () const
 Возвращает текущий режим входа в синхропространство.
void Enter (bool ReentrantMode=false)
 Возвращает текущий режим входа в синхропространство.
bool TryEnter (bool ReentrantMode=false)
 Возвращает текущий режим входа в синхропространство.
void Leave (bool ReentrantMode=false)
 Производит выход из синхропространства.
template<typename MethodSignatureT>
SpecUtils::ThreadProcFunctor
< typename
SignatureInfo
< MethodSignatureT >
::FuncSign > 
Thread (MethodSignatureT Method, BasicAsyncProc::ThreadPriority Priority=BasicAsyncProc::tpNormal, bool HoldRef=true)
 Запустить асинхронную потоковую процедуру.
template<typename MethodSignatureT>
SpecUtils::DeferProcFunctor
< typename
SignatureInfo
< MethodSignatureT >
::FuncSign > 
Defer (MethodSignatureT Method, bool HoldRef=true)
 Запустить асинхронную отложеную процедуру.
template<typename MethodSignatureT>
SpecUtils::ThreadProcFunctor
< typename
SignatureInfo
< MethodSignatureT >
::FuncSign > 
SuspendThread (MethodSignatureT Method, BasicAsyncProc::ThreadPriority Priority=BasicAsyncProc::tpNormal, bool HoldRef=true)
 Создать отсроченную асинхронную потоковую процедуру.
template<typename MethodSignatureT>
SpecUtils::DeferProcFunctor
< typename
SignatureInfo
< MethodSignatureT >
::FuncSign > 
SuspendDefer (MethodSignatureT Method, bool HoldRef=true)
 Создать отсроченную асинхронную отложеную процедуру.

Защищенные члены

 SynchroObject (const SynchroSpace::Ptr &Space=Cntm::SynchroSpace::Ptr())
 Конструктор используется, когда операция создания синхрообъекта уже выполняется внутри пространства, к которому будет принадлежать новый объект.
 SynchroObject (Sync &ConstructSync)
 Конструктор используется, когда объект создается в новом или просто другом синхропространстве.
 SynchroObject (ReentrantSync &ConstructSync)
 Конструктор используется, когда объект создается в новом или просто другом синхропространстве.
virtual ~SynchroObject ()
 Деструктор.

Друзья

class SynchroRefBase
class SynchroRefBaseEx
class SynchroDeleteTask

Классы

class  SynchroDeleteTask
 Класс синхрозадачи, которая выполняет операции деинициализации объекта.

Определения типов

typedef RefPtr<SynchroObject> Cntm::SynchroObject::Ptr

Переопределяет метод предка Cntm::IBasicSynchro.

См. определение в файле SynchroObject.h строка 112


Конструктор(ы)

Cntm::SynchroObject::SynchroObject ( const SynchroSpace::Ptr Space = Cntm::SynchroSpace::Ptr()  )  [protected]

Конструктор используется, когда операция создания синхрообъекта уже выполняется внутри пространства, к которому будет принадлежать новый объект.

Если синхропространство не указано, то будет использовано главное синхропространство (т.о. если в программе используется только главное синхропространство, то нет необходимости указывать его явно).

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

См. определение в файле SynchroObject.cpp строка 18

Перекрестные ссылки Cntm::SynchroSpace::Main().

Cntm::SynchroObject::SynchroObject ( Sync ConstructSync  )  [protected]

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

В этом случае конструктор синхрообъекта пытается извлечь синхропространство из ConstructSync и если ConstructSync был проинициализирован, то использует извлеченное синхропространство. Если был указан пустой ConstructSync, то первым делом конструктор синхрообъекта создает дополнительное синхропространство (класс Cntm::ExtraSynchroSpace) и присваивает его ConstructSync (который передан по ссылке). Т.о. работа конструктора SynchroObject и конструкторов производных классов всегда будет осуществляться внутри синхпространства данного объекта.

Аргументы:
ConstructSync - ссылка на синхросекцию, которая обеспечивает нахождение в синхропространстве при создании объекта.

См. определение в файле SynchroObject.cpp строка 25

Перекрестные ссылки Cntm::BasicSync::Object().

Cntm::SynchroObject::SynchroObject ( ReentrantSync ConstructSync  )  [protected]

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

В этом случае конструктор синхрообъекта пытается извлечь синхропространство из ConstructSync и если ConstructSync был проинициализирован, то использует извлеченное синхропространство. Если был указан пустой ConstructSync, то первым делом конструктор синхрообъекта создает дополнительное синхропространство (класс Cntm::ExtraSynchroSpace) и присваивает его ConstructSync (который передан по ссылке). Т.о. работа конструктора SynchroObject и конструкторов производных классов всегда будет осуществляться внутри синхпространства данного объекта.

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

См. определение в файле SynchroObject.cpp строка 34

Перекрестные ссылки Cntm::BasicSync::Object().

virtual Cntm::SynchroObject::~SynchroObject (  )  [inline, protected, virtual]

Деструктор.

См. определение в файле SynchroObject.h строка 286


Методы

SynchroSpace::Ptr Cntm::SynchroObject::Space (  )  const [inline, virtual]

Возвращает синхропространство, к которому принадлежит синхрообъект.

Результат не может принять значение NULL.

Замещает Cntm::IBasicSynchro.

См. определение в файле SynchroObject.h строка 117

bool Cntm::SynchroObject::IsReentrantMode (  )  const [inline, virtual]

Возвращает текущий режим входа в синхропространство.

Возвращает true, если вход во !все! синхропространства, в которых поток выполнения находится в данный момент, был произведен в реентерабельном режиме. Если был хотя бы один вход в нереентерабельном режиме, то возвращается false.

Метод должен вызываться только после входа в синхропространство и в том же потоке, который произвел вход.

Вызывает Space()->IsReentrantMode().

Замещает Cntm::IBasicSynchro.

См. определение в файле SynchroObject.h строка 126

void Cntm::SynchroObject::Enter ( bool  ReentrantMode = false  )  [inline, virtual]

Возвращает текущий режим входа в синхропространство.

Возвращает true, если вход во !все! синхропространства, в которых поток выполнения находится в данный момент, был произведен в реентерабельном режиме. Если был хотя бы один вход в нереентерабельном режиме, то возвращается false.

Метод должен вызываться только после входа в синхропространство и в том же потоке, который произвел вход.

Вызывает Space()->Enter().

Аргументы:
ReentrantMode - режим входа (реентерабельный или нет). Описание режимов входа приведено в описании класса Cntm::SynchroSpace.

Замещает Cntm::IBasicSynchro.

См. определение в файле SynchroObject.h строка 136

bool Cntm::SynchroObject::TryEnter ( bool  ReentrantMode = false  )  [inline, virtual]

Возвращает текущий режим входа в синхропространство.

Возвращает true, если вход во !все! синхропространства, в которых поток выполнения находится в данный момент, был произведен в реентерабельном режиме. Если был хотя бы один вход в нереентерабельном режиме, то возвращается false.

Метод должен вызываться только после входа в синхропространство и в том же потоке, который произвел вход.

Вызывает Space()->TryEnter().

Аргументы:
ReentrantMode - режим входа (реентерабельный или нет). Описание режимов входа приведено в описании класса Cntm::SynchroSpace.

Замещает Cntm::IBasicSynchro.

См. определение в файле SynchroObject.h строка 146

void Cntm::SynchroObject::Leave ( bool  ReentrantMode = false  )  [inline, virtual]

Производит выход из синхропространства.

Парный метод для Enter() и TryEnter() (когда последний вернул true). Параметр ReentrantMode должен иметь такое же значение, как и у парного ему метода Enter() и TryEnter().

Более подробное описание режимов входа и случаев, когда вход в синхропространство выполняется из другого синхропространства приведенов в описании класса Cntm::SynchroSpace.

Вызывает Space()->Leave().

Аргументы:
ReentrantMode - режим входа (реентерабельный или нет). Описание режимов входа приведено в описании класса Cntm::SynchroSpace.

Замещает Cntm::IBasicSynchro.

См. определение в файле SynchroObject.h строка 156

template<typename MethodSignatureT>
SpecUtils::ThreadProcFunctor< typename SignatureInfo < MethodSignatureT >::FuncSign > Cntm::SynchroObject::Thread ( MethodSignatureT  Method,
BasicAsyncProc::ThreadPriority  Priority = BasicAsyncProc::tpNormal,
bool  HoldRef = true 
) [inline]

Запустить асинхронную потоковую процедуру.

Первым параметром указывается адрес метода, который будет выполнен в новом потоке. Описание остальных параметров, возвращаемого значения и принципов работы приведено в описании класса Cntm::AsyncProc и метода Cntm::AsyncProc::Thread()(). После вызова метода Thread() в скобках указываются передаваемые потоковой функции аргументы. Thread(...) может рассматриваться как идентификатор функции, а вторая пара скобок - как ее вызов.

Пример:

 Thread(&Class1::Thread1)(Arg1, Arg2);
 Thread(&Class1::Thread2)();

См. определение в файле SynchroObject.h строка 173

template<typename MethodSignatureT>
SpecUtils::DeferProcFunctor< typename SignatureInfo < MethodSignatureT >::FuncSign > Cntm::SynchroObject::Defer ( MethodSignatureT  Method,
bool  HoldRef = true 
) [inline]

Запустить асинхронную отложеную процедуру.

Первым параметром указывается адрес метода, который будет выполнен в синхронно отложенно с использованием механизма отложенных синхрозаданий (см. класс Cntm::SynchroSpace). Описание остальных параметров, возвращаемого значения и принципов работы приведено в описании класса Cntm::AsyncProc и метода Cntm::AsyncProc::Defer()(). После вызова метода Defer() в скобках указываются передаваемые отложенной функции аргументы. Defer(...) может рассматриваться как идентификатор функции, а вторая пара скобок - как ее вызов.

Пример:

 Defer(&Class1::ShowMsg)(Arg1, Arg2);
 Defer(&Class1::Start)(); 

См. определение в файле SynchroObject.h строка 199

Перекрестные ссылки Space().

template<typename MethodSignatureT>
SpecUtils::ThreadProcFunctor< typename SignatureInfo < MethodSignatureT >::FuncSign > Cntm::SynchroObject::SuspendThread ( MethodSignatureT  Method,
BasicAsyncProc::ThreadPriority  Priority = BasicAsyncProc::tpNormal,
bool  HoldRef = true 
) [inline]

Создать отсроченную асинхронную потоковую процедуру.

Первым параметром указывается адрес метода, который будет выполнен в новом потоке. Описание остальных параметров, возвращаемого значения и принципов работы приведено в описании класса Cntm::AsyncProc и метода Cntm::AsyncProc::SuspendThread()(). После вызова метода SuspendThread() в скобках указываются передаваемые потоковой функции аргументы. SuspendThread(...) может рассматриваться как идентификатор функции, а вторая пара скобок - как ее вызов.

Пример:

 SuspendThread(&Class1::Thread1)(Arg1, Arg2);
 SuspendThread(&Class1::Thread2)();

См. определение в файле SynchroObject.h строка 223

template<typename MethodSignatureT>
SpecUtils::DeferProcFunctor< typename SignatureInfo < MethodSignatureT >::FuncSign > Cntm::SynchroObject::SuspendDefer ( MethodSignatureT  Method,
bool  HoldRef = true 
) [inline]

Создать отсроченную асинхронную отложеную процедуру.

Первым параметром указывается адрес метода, который будет выполнен в синхронно отложенно с использованием механизма отложенных синхрозаданий (см. класс Cntm::SynchroSpace). Описание остальных параметров, возвращаемого значения и принципов работы приведено в описании класса Cntm::AsyncProc и метода Cntm::AsyncProc::SuspendDefer()(). После вызова метода SuspendDefer() в скобках указываются передаваемые отложенной функции аргументы. SuspendDefer(...) может рассматриваться как идентификатор функции, а вторая пара скобок - как ее вызов.

Пример:

 SuspendDefer(&Class1::ShowMsg)(Arg1, Arg2);
 SuspendDefer(&Class1::Start)(); 

См. определение в файле SynchroObject.h строка 249

Перекрестные ссылки Space().


Документация по друзьям класса и функциям, отноносящимся к классу

friend class SynchroRefBase [friend]

См. определение в файле SynchroObject.h строка 290

friend class SynchroRefBaseEx [friend]

См. определение в файле SynchroObject.h строка 291

friend class SynchroDeleteTask [friend]

См. определение в файле SynchroObject.h строка 292


Объявления и описания членов классов находятся в файлах:
SourceForge.net Logo
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой  doxygen 1.5.3