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