Для того, чтобы создать свой класс синхрообъекта, его нужно унаследовать от классов 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::SynchroObject::SynchroObject | ( | const SynchroSpace::Ptr & | Space = Cntm::SynchroSpace::Ptr() |
) | [protected] |
Конструктор используется, когда операция создания синхрообъекта уже выполняется внутри пространства, к которому будет принадлежать новый объект.
Если синхропространство не указано, то будет использовано главное синхропространство (т.о. если в программе используется только главное синхропространство, то нет необходимости указывать его явно).
Space | - (опционально) используется для задания синхропространства, к которому будет принадлежать создаваемый объект. |
См. определение в файле 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] |
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.
Метод должен вызываться только после входа в синхропространство и в том же потоке, который произвел вход.
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.
ReentrantMode | - режим входа (реентерабельный или нет). Описание режимов входа приведено в описании класса Cntm::SynchroSpace. |
Замещает Cntm::IBasicSynchro.
См. определение в файле SynchroObject.h строка 156
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(...) может рассматриваться как идентификатор функции, а вторая пара скобок - как ее вызов.
Пример:
См. определение в файле SynchroObject.h строка 173
SpecUtils::DeferProcFunctor< typename SignatureInfo < MethodSignatureT >::FuncSign > Cntm::SynchroObject::Defer | ( | MethodSignatureT | Method, | |
bool | HoldRef = true | |||
) | [inline] |
Запустить асинхронную отложеную процедуру.
Первым параметром указывается адрес метода, который будет выполнен в синхронно отложенно с использованием механизма отложенных синхрозаданий (см. класс Cntm::SynchroSpace). Описание остальных параметров, возвращаемого значения и принципов работы приведено в описании класса Cntm::AsyncProc и метода Cntm::AsyncProc::Defer()(). После вызова метода Defer() в скобках указываются передаваемые отложенной функции аргументы. Defer(...) может рассматриваться как идентификатор функции, а вторая пара скобок - как ее вызов.
Пример:
См. определение в файле SynchroObject.h строка 199
Перекрестные ссылки Space().
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
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
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |