Go to the documentation of this file.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
00027
00028
00029
00030
00031
00032
00033 namespace
00034 cmtk
00035 {
00036
00037 ThreadSemaphore::ThreadSemaphore( const unsigned int initial )
00038 {
00039 this->m_Counter = initial;
00040
00041 pthread_mutex_init( &this->m_Mutex, NULL );
00042 pthread_cond_init( &this->m_Condition, NULL );
00043 }
00044
00045 ThreadSemaphore::~ThreadSemaphore()
00046 {
00047 pthread_mutex_destroy( &this->m_Mutex );
00048 pthread_cond_destroy( &this->m_Condition );
00049 }
00050
00051 void
00052 ThreadSemaphore::Post( const unsigned int increment )
00053 {
00054 pthread_mutex_lock( &this->m_Mutex );
00055 this->m_Counter += increment;
00056 pthread_mutex_unlock( &this->m_Mutex );
00057
00058 pthread_cond_broadcast( &this->m_Condition );
00059 }
00060
00061 void
00062 ThreadSemaphore::Wait()
00063 {
00064 pthread_mutex_lock( &this->m_Mutex );
00065
00066 while ( !this->m_Counter )
00067 pthread_cond_wait( &this->m_Condition, &this->m_Mutex );
00068
00069 --this->m_Counter;
00070 pthread_mutex_unlock( &this->m_Mutex );
00071 }
00072
00073 }