00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef _MPCL_SYSTEM_POSIX_1_THREAD__
00027 #define _MPCL_SYSTEM_POSIX_1_THREAD__
00028
00029 #include <pthread.h>
00030 #include "../thread.hh"
00031
00032
00034 namespace mpcl
00035 {
00036
00038 namespace system
00039 {
00040
00045 class TThread : public IThread
00046 {
00047
00048 private:
00049
00055 pthread_t tPosixId;
00056
00057
00058 protected:
00059
00060
00061
00062
00063
00068 static void* _starter (void* pvTHREAD_INSTANCE)
00069 {
00070 ((TThread*) pvTHREAD_INSTANCE)->body();
00071 return NULL;
00072 }
00073
00074
00075 protected:
00076
00077
00078
00079
00080
00081 void exit (void)
00082 {
00083 pthread_exit (NULL);
00084 }
00085
00086 void body (void) = 0;
00087
00088
00089 public:
00090
00091
00092
00093
00094
00096 TThread (void) :
00097 IThread () ,
00098 tPosixId (0) {}
00099
00100 void start (void)
00101 {
00102 if ( pthread_create (&tPosixId, NULL, _starter, this) )
00103 {
00104 throw TErrorException (GetErrorMessage(), __FILE__, __LINE__);
00105 }
00106 }
00107
00108 void join (void)
00109 {
00110 if ( pthread_join (tPosixId, NULL) )
00111 {
00112 throw TErrorException (GetErrorMessage(), __FILE__, __LINE__);
00113 }
00114 }
00115
00116 };
00117
00118 }
00119
00120 }
00121
00122
00123 #endif // not _MPCL_SYSTEM_POSIX_1_THREAD__