00001 /* 00002 * CntmLib - Подсчет ссылок, потоки, синхронизация, асинхронные процедуры, события 00003 * Copyright (c) 2005, Овсеевич Роман, CntmLib@mail.ru 00004 * _______________________________________________________________________________ 00005 * Разрешено свободное использование, копирование, распространение, изменение 00006 * (изменение сведений об авторских правах запрещено). Запрещена продажа и 00007 * включение всей библиотеки или ее частей в другие библиотеки. В сведениях об 00008 * авторских правах на программу (или сведениях о программе, об авторах, 00009 * использованных средствах разработки и т.д.) должна быть указана информация 00010 * о библиотеке CntmLib, ее авторе и, возможно, сайте или email'е. 00011 * Библиотека поставляется "как есть", без каких-либо гарантий со стороны автора. 00012 */ 00013 00014 /** 00015 * \defgroup Synchro Cntm.Synchro 00016 * Пакет предоставляет базовые средства, упорядочивающие взаимодействие различных компонентов системы. К этим средствам относятся такие понятия, как синхропространства, синхрообъекты, отложенные операции. Эти средства являются фундаментом, обеспечивающим надежное взаимодействие компонентов в многопоточных системах, предоставляющим механизмы, которые сводят к минимуму влияние поведения одного компонента на другой при их взаимодействии. Все средства, предосталяемые этим пакетом, используют подсчет ссылок. 00017 * 00018 * <H2>Синхропространства</H2> 00019 * 00020 * <H3>Понятие синхропространства</H3> 00021 * 00022 * Пакет предоставляет механизм, обеспечивающий синхронизацию потоков и выполнение отложенных (сериализованных) операций. Этот механизм называется синхропространством. 00023 * 00024 * С точки зрения синхронизации синхропространство можно представить как мьютекс, который может быть захвачен только одним потоком выполнения. Процесс захвата мьютекса будем называть входом в синхропространство. Внутри синхропространства может находиться только один поток выполнения, остальные будут ожидать его выхода на точке входа в синхропространство. 00025 * 00026 * Выполнение отложенных операций происходит следующим образом. Инициатор готовит задание тем или иным способом (о способах ниже), помещенает в очередь синхропространства. Синхропространство в определенный момент времени запускает операцию на выполнение внутри синхропространства, т.е. синхронизированно со всем другими потоками выполнения. После завершения выполнения выполнения операция удаляется из очереди. 00027 * 00028 * В программе м.б. несколько синхропространств. Синхропространству соответствует класс Cntm::SynchroSpace. Более детальное описание функций синхропространства приведено в документации по классу Cntm::SynchroSpace. 00029 * 00030 * <H3>Типы синхропространств</H3> 00031 * 00032 * Синхропространства делятся на 2 типа: главные и дополнительные. В программе м.б. только одно главновное синхропространство и несколько дополнительных. 00033 * 00034 * Главные синхропространства помимо перечисленных решают еще одну задачу - обеспечение жизненного цикла системы. Это означает, что в главном потоке запускается цикл работы системы (обычно это цикл обработки сообщений), выход из которого означает завершение работы системы. Обеспечение жизненного цикла, в частности, означает и то, что система не завершит свою работу, пока существует хотя бы один объект, использующий функции синхропространств (такие объекты называются синхрообъектами и будут рассмотрены ниже). 00035 * 00036 * Главные синхропространства могут сами полностью реализовывать свои функции либо интегрироваться с другими библиотеками, предоставляющими подобную функциональность (на данный момент реализована интеграция с библиотекой QT). Главному синхропространству, которое само реализует все функции, соответствует класс Cntm::MainSynchroSpace. Для интеграции с QT следует использовать класс Cntm::QTMainSynchroSpace. Интеграция заключается в том, что для синхронизации используется мьютекс библиотеки QT, а для выполнения отложенных операций - цикл обработки событий QT, т.е. отложенные операции синхронизированы со всеми событиями QT. 00037 * 00038 * Дополнительные синхропространства не несут специальных функций. Дополнительному синхропространству соответствует класс Cntm::ExtraSynchroSpace. 00039 * 00040 * <H2>Синхрообъекты</H2> 00041 * 00042 * Синхрообъект, это объект, обладающий встроенными средствами синхронизации и использующий функции, предоставляемые синхропространством. Синхрообъект жестко связан со своим синхропространством. Объект принадлежит определенному синхропространству, которое указывается при создании объекта. Передача объекта другому синхропространству запрещена. Подробное описание функций синхрообъекта приведено в Cntm::SynchroObject, который является базой для синхрообъектов. 00043 * 00044 * Синхрообъект является ссылочным объектом. Чтобы определить свой класс синхрообъекта его нужно унаследовать от одного из 3 классов: Cntm::SynchroRefBase, Cntm::SynchroRefBaseEx и Cntm::SynchroAggregatedBase. Эти классы объединяют соответствующий способ подсчета ссылок и средства синхронизации, предоставляемые Cntm::SynchroObject. Особенностью классов Cntm::SynchroRefBase и Cntm::SynchroRefBaseEx является то, что гарантируется отложенный вызов их деструкторов и метода OnReleaseInstance() для Cntm::SynchroRefBaseEx. 00045 * 00046 * <H2>Особенности использования</H2> 00047 * 00048 * Точки входа и выхода из синхропространства задаются вызовами методов Enter() и Leave() соответственно. Существует альтернативный способ входа и выхода - с помощью scoped-объектов. В конструкторе scoped-объекта происходит вход, а в деструкторе - выход. Классы, реализующие эту функциональность - Cntm::Sync и Cntm::ReentrantSync. 00049 * 00050 * Отложенные операции (точнее, отложенные синхрозадачи) редко используются напрямую, обычно применяются средства, основанные на отложенных операциях. К этим средствам относятся отложенные события и отложенные асинхронные процедуры. Также отложенные операции используются и при уничтожении самих синхрообъектов. 00051 */ 00052 00053 #include <Cntm/Synchro/IBasicSynchro.h> 00054 #include <Cntm/Synchro/SynchroObject.h> 00055 #include <Cntm/Synchro/SynchroRefBase.h> 00056 #include <Cntm/Synchro/SynchroRefBaseEx.h> 00057 #include <Cntm/Synchro/SynchroAggregatedBase.h> 00058 #include <Cntm/Synchro/SynchroSpace.h> 00059 #include <Cntm/Synchro/MainSynchroSpace.h> 00060 #include <Cntm/Synchro/QTMainSynchroSpace.h> 00061 #include <Cntm/Synchro/ExtraSynchroSpace.h> 00062 #include <Cntm/Synchro/LoopInNoMainThreadException.h> 00063 #include <Cntm/Synchro/NoReentrantModeException.h> 00064 #include <Cntm/Synchro/SyncScopes/Sync.h> 00065 #include <Cntm/Synchro/SyncScopes/ReentrantSync.h>
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |