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
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |