SysThread.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_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

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