SysCriticalSection.h

См. документацию.
00001 /*
00002  * CntmLib - Подсчет ссылок, потоки, синхронизация, асинхронные процедуры, события
00003  * Copyright (c) 2005, Овсеевич Роман, CntmLib@mail.ru
00004  * _______________________________________________________________________________
00005  * Разрешено свободное использование, копирование, распространение, изменение
00006  * (изменение сведений об авторских правах запрещено). Запрещена продажа и 
00007  * включение всей библиотеки или ее частей в другие библиотеки. В сведениях об
00008  * авторских правах на программу (или сведениях о программе, об авторах, 
00009  * использованных средствах разработки и т.д.) должна быть указана информация
00010  * о библиотеке CntmLib, ее авторе и, возможно, сайте или email'е.
00011  * Библиотека поставляется "как есть", без каких-либо гарантий со стороны автора.
00012  */ 
00013 
00014 #ifndef CNTM_SYSCRITICALSECTION_H
00015 #define CNTM_SYSCRITICALSECTION_H
00016 #include <pthread.h>
00017 #include <boost/utility.hpp>
00018 
00019 namespace Cntm
00020 {
00021         namespace SpecUtils
00022         {       
00023 
00024                 /**
00025                  * Реализация критической секции. 
00026                  * @author Овсеевич Р.
00027                  * \ingroup SystemUtils
00028                  */
00029                 class SysCriticalSection: boost::noncopyable
00030                 {
00031                 public:
00032 
00033                         /**
00034                          * Блокирующий объект.
00035                          * @author Овсеевич Р.
00036                          * \ingroup SystemUtils
00037                          */
00038                         class Lock
00039                         {
00040                         public:
00041                         
00042                                 /**
00043                                  * Конструктор.
00044                                  */
00045                                 Lock(): critSect(NULL) {}
00046 
00047                                 /**
00048                                  * Конструктор. Блокирует критическую сакцию.
00049                                  * 
00050                                  * Исключение: SystemException в случае ошибки вызова системной функции.
00051                                  */
00052                                 Lock(SysCriticalSection& CritSect): critSect(&CritSect) { critSect->Enter(); }
00053 
00054                                 /**
00055                                  * Деструктор. Разблокирует критическую сакцию.
00056                                  * 
00057                                  * Исключение: SystemException в случае ошибки вызова системной функции.
00058                                  */
00059                                 ~Lock() { if (critSect) critSect->Leave(); }
00060                                 
00061                                 /**
00062                                  * Разблокировать критическую сакцию.
00063                                  * 
00064                                  * Исключение: SystemException в случае ошибки вызова системной функции.
00065                                  */
00066                                 void Unlock() { if (critSect) critSect->Leave(); critSect = NULL; }
00067                                 
00068                         private:
00069                         
00070                                 /**
00071                                  * Указатель на критическую секцию. 
00072                                  */
00073                                 SysCriticalSection* critSect;
00074                         };
00075 
00076 
00077                         /**
00078                          * Конструктор.
00079                          * 
00080                          * Исключение: SystemException в случае ошибки вызова системной функции.
00081                          * @param Recurse - создавать рекурсивный или обычный мютекс (по умолчанию рекурсивный).
00082                          */
00083                         SysCriticalSection(bool Recurse = true);
00084 
00085                         /**
00086                          * Деструктор. 
00087                          */
00088                         ~SysCriticalSection();
00089 
00090                         /**
00091                          * Возвращает указатель на линуксовый мьютекс. 
00092                          */
00093                         pthread_mutex_t* PthreadMutex() { return &mutex; }
00094 
00095                         /**
00096                          * Производит блокировку объекта. Ожидание разблокировки объекта другим потоком может тянуться бесконечно долго.
00097                          * 
00098                          * Исключение: SystemException в случае ошибки вызова системной функции. 
00099                          */
00100                         void Enter();
00101 
00102                         /**
00103                          * Производит попытку блокировки объекта. Если объект не заблокирован, то будет произведена его блокировка и будет возвращено true. В противном случае произойдет немедленный выход из метода и будет возвращено false. Данный метод предназначен для блокировки без ожидания.
00104                          * 
00105                          * Исключение: SystemException в случае ошибки вызова системной функции.
00106                          */
00107                         bool TryEnter();
00108 
00109                         /**
00110                          * Производит разблокировку объекта ранее заблокированного данным потоком.
00111                          * 
00112                          * Исключение: SystemException в случае ошибки вызова системной функции.
00113                          */
00114                         void Leave();
00115 
00116                 private:                
00117                         /**
00118                          * Линуксовский мьтекс. 
00119                          */
00120                         pthread_mutex_t mutex;
00121                 };
00122 
00123         }
00124 }
00125 #endif //CNTM_SYSCRITICALSECTION_H

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