//////////////////////////////////////////////////////////////////////////// // CSemaphore クラスのインプリメンテーション // //////////////////////////////////////////////////////////////////////////// #include #include #include #include #include "Semaphore.h" //////////////////////////////////////////////////////////////////////////// // 構築/破棄 //////////////////////////////////////////////////////////////////////////// CSemaphore::CSemaphore( int argMaxCount ) { MaxCount = argMaxCount; sem_init( &m_Semaphore, 0, argMaxCount ); } CSemaphore::~CSemaphore() { sem_destroy( &m_Semaphore ); } //////////////////////////////////////////////////////////////////////////// // メソッド //////////////////////////////////////////////////////////////////////////// // P操作 void CSemaphore::P() { int r = sem_wait( &m_Semaphore ); assert( !r ); } // V操作 void CSemaphore::V() { int r = sem_post( &m_Semaphore ); assert( !r ); } // 占有出来るなら占有する // 占有出来たら真を返す bool CSemaphore::Try() { return sem_trywait( &m_Semaphore ) == 0; } // 最大待ち時間を指定して待ち合わせる bool CSemaphore::WaitForTime( int ms ) { // 100ms単位でTryを行う。 // 最大ms時間だけ待ち合わせる struct timespec req; int cnt = ms / 100; // Tryを行う回数 int i; // 100ms単位でTryを行う req.tv_sec = 0; req.tv_nsec = 100 * 1000 * 1000; for ( i = 0; i < cnt; i++ ) { // 100ms待ち合わせる if( nanosleep( &req, NULL ) ) return false; // 占有を試みる if ( Try() ) return true; } // 100msの剰余時間だけ待ち合わせる req.tv_nsec = ( ms % 100 ) * 1000 * 1000; if( nanosleep( &req, NULL ) ) return false; // 最後に一回占有を試みる return Try(); }