SysSignalFlag.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_SYSSIGNALFLAG_H
00015 #define CNTM_SYSSIGNALFLAG_H
00016 #include <pthread.h>
00017 #include <sys/time.h>
00018 #include <boost/utility.hpp>
00019 #include <Cntm/Utils/IntTypes.h>
00020 #include <Cntm/SystemUtils/SysCriticalSection.h>
00021 
00022 namespace Cntm
00023 {
00024         namespace SpecUtils
00025         {
00026         
00027                 /**
00028                  * Реализация сигнального флага. Он имеет 2 состояния сигнальное (установленное) и несигнальное (сброшенное).
00029                  *
00030                  * Когда флаг находится в несигнальном состоянии, то потоки, вызывающие функцию Wait() переводятся в ожидающее состояние. Когда флаг переходит в сигнальное состояние, ожидание завершается. Если флаг на момент входа в Wait находился в сигнальном состоянии, то ожидание не производится.
00031                  *
00032                  * Сигнальный флаг может быть 2 типов: с автосбросом и без автосброса. В первом случае, когда функция Wait завершает свою работу при переходе в сигнальное состояние, флаг автоматически переводится обратно в несигнальное состояние. Это обеспечивает проход только одного из нескольких потоков, ожидающих на флаге.
00033                  * @author Овсеевич Р.
00034                  * \ingroup SystemUtils
00035                  */
00036                 class SysSignalFlag: boost::noncopyable
00037                 {
00038                 public:
00039 
00040                         /**
00041                          * Конструктор.
00042                          *
00043                          * Исключение: SystemException в случае ошибки вызова системной функции.
00044                          * @param AutoReset - тип флага: с автосбросом или нет (по умолчанию - автосброс установлен).
00045                          * @param Init - начальное значение флага (по умолчанию false).
00046                          */
00047                         SysSignalFlag(bool AutoReset = true, bool Init = false);
00048 
00049                         /**
00050                          * Деструктор.
00051                          */
00052                         ~SysSignalFlag();
00053 
00054                         /**
00055                          * Ожидает перехода в сигнальное состояние. MSecTimeout - интервал ожидания наступления сигнального состояния в мс. Если объект находится в сигнальном состоянии, возврат происходит сразу с результатом true. Если сигнальное состояние наступило до истечения MSecTimeout или уже было на момент вызова Wait, то возвращается true, иначе возвращается false. Если MSecTimeout = 0, ожидания не происходит, возвращается true, если объект был в сигнальном состоянии, и false в противном случае.
00056                          * 
00057                          * Исключение: SystemException в случае ошибки вызова системной функции.
00058                          * @param Infinite - бесконечное ожидание.
00059                          * @param MSecTimeout - длительность ожидания в мсек.
00060                          */
00061                         bool Wait(bool Infinite, uint MSecTimeout);
00062 
00063                         /**
00064                          * Перевести флаг в сигнальное состояние.
00065                          * 
00066                          * Исключение: SystemException в случае ошибки вызова системной функции.
00067                          */
00068                         void Set();
00069 
00070                         /**
00071                          * Перевести флаг в несигнальное состояние.
00072                          * 
00073                          * Исключение: SystemException в случае ошибки вызова системной функции.
00074                          */
00075                         void Reset();
00076 
00077                 private:
00078                 
00079                         /**
00080                          * Тип флага: с автосбросом или нет.
00081                          */
00082                         bool autoReset;
00083                         /**
00084                          * Мьютекс.
00085                          */
00086                         SysCriticalSection mutex;
00087                         /**
00088                          * Условная переменная.
00089                          */
00090                         pthread_cond_t cond;
00091                         /**
00092                          * Состояние.
00093                          */
00094                         bool flag;
00095 
00096                         /**
00097                          * Перевести флаг в сигнальное состояние для одного или для всех ожидающих потоков в зависимости от типа флага.
00098                          */
00099                         void SignalCond();
00100                 };
00101 
00102         }
00103 }
00104 
00105 #endif //CNTM_SYSSIGNALFLAG_H

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