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_SYSTHREAD_H 00015 #define CNTM_SYSTHREAD_H 00016 #include <pthread.h> 00017 #include <Cntm/Exceptions/SystemException.h> 00018 00019 // Макрос содификатора вызова потоковой функции. 00020 #define CNTM_SYSTHREAD_PROC_DECL 00021 00022 // Макрос возвращаемого значения при выходе из потоковой функции 00023 #define CNTM_SYSTHREAD_RETURN_VALUE NULL 00024 00025 namespace Cntm 00026 { 00027 namespace SpecUtils 00028 { 00029 00030 /** 00031 * Класс для запуска и выхода из потока. 00032 * 00033 * Потоковая функция или статический метод класса могут выглядеть примерно так: 00034 * \code 00035 * SysThread::ResultType CNTM_SYSTHREAD_PROC_DECL ThreadProc(void* Arg) 00036 * { 00037 * ... 00038 * return CNTM_SYSTHREAD_RETURN_VALUE; 00039 * } 00040 * \endcode 00041 * 00042 * Класс обеспечивает многопоточность. 00043 * @author Овсеевич Р. 00044 * \ingroup SystemUtils 00045 */ 00046 class SysThread 00047 { 00048 public: 00049 00050 typedef void* ResultType; 00051 00052 /** 00053 * Приоритет потока. 00054 */ 00055 enum Priority 00056 { 00057 /** 00058 * Обычный приоритет. 00059 */ 00060 prNormal, 00061 00062 /** 00063 * Пониженный приоритет. 00064 */ 00065 prLow, 00066 00067 /** 00068 * Повышенный приоритет. 00069 */ 00070 prHigh, 00071 00072 /** 00073 * Наивысший приоритет. Может устанавливаться только root'ом. 00074 */ 00075 prTimeCritical 00076 }; 00077 00078 /** 00079 * Запуск потока. Новый поток начинает выполняться в функции Proc с аргументом Arg и приоритетом Priority. 00080 */ 00081 static void Start(ResultType (CNTM_SYSTHREAD_PROC_DECL *Proc) (void*), void* Arg, SysThread::Priority Priority = prNormal) 00082 { 00083 pthread_attr_t ta; 00084 pthread_attr_init(&ta); 00085 pthread_attr_setdetachstate(&ta, PTHREAD_CREATE_DETACHED); 00086 pthread_t th; 00087 if (pthread_create(&th, &ta, reinterpret_cast<void*(*)(void*)>(Proc), Arg) != 0) 00088 throw SystemException("Создание потока Cntm::SpecUtils::SysThread::Start()", "Недостаточно ресурсов для создания потока или потоков слишком много"); 00089 pthread_attr_destroy(&ta); 00090 } 00091 00092 /** 00093 * Выход из потока. Вызывается из потоковой функции в случае досрочного завершения потока. 00094 */ 00095 static void Exit() { pthread_exit(NULL); } 00096 }; 00097 00098 } 00099 } 00100 00101 #endif //CNTM_SYSTHREAD_H
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |