Linux平臺用C++實現訊號量,同步執行緒
阿新 • • 發佈:2019-01-18
使用Linux平臺上現有的訊號量sem_t相關的一組API,可以方便地進行執行緒同步。現在用pthread_mutex_t和pthread_cond_t相關的一組API實現訊號量機制。這組API包括:pthread_mutex_init,pthread_cond_init,pthread_mutex_lock,pthread_cond_signal,pthread_mutex_unlock,pthread_cond_wait,pthread_cond_timedwait,pthread_cond_destroy和pthread_mutex_destroy,可以在http://www.9linux.com
MySemaphore.h
- #ifndef Semaphore_Header
- #define Semaphore_Header
- #include <iostream>
- #include <pthread.h>
- #include <errno.h>
- #include <assert.h>
- usingnamespace std;
-
//------------------------------------------------------------------------
- class CSemaphoreImpl
- {
- protected:
- CSemaphoreImpl(int n, int max);
- ~CSemaphoreImpl();
- void SetImpl();
- void WaitImpl();
- bool WaitImpl(long lMilliseconds);
- private:
- volatileint m_n;
- int m_max;
-
pthread_mutex_t m_mutex;
- pthread_cond_t m_cond;
- };
- inlinevoid CSemaphoreImpl::SetImpl()
- {
- if (pthread_mutex_lock(&m_mutex))
- cout<<"cannot signal semaphore (lock)"<<endl;
- if (m_n < m_max)
- {
- ++m_n;
- }
- else
- {
- pthread_mutex_unlock(&m_mutex);
- cout<<"cannot signal semaphore: count would exceed maximum"<<" m_n = "<<m_n<<"m_max = "<<m_max<<endl;
- }
- //重新開始等待m_cond的執行緒,可被排程
- if (pthread_cond_signal(&m_cond))
- {
- pthread_mutex_unlock(&m_mutex);
- cout<<"cannot signal semaphore"<<endl;
- }
- pthread_mutex_unlock(&m_mutex);
- }
- //------------------------------------------------------------------------
- /*
- 訊號量同步機制
- 訊號量提供一個計數值,可以進行原子操作。V 將計數值加1,使得
- 等待該訊號量的執行緒可以被呼叫(呼叫Set()),P 將計數值減1,使
- 當前執行緒被掛起,進行睡眠(呼叫Wait())。
- 當訊號量的計數值被初始化為0時,呼叫P操作,將掛起當前執行緒。
- 當訊號量被啟用,即呼叫V操作後,被掛起的執行緒就有機會被重新排程了。
- */
- class CMySemaphore: private CSemaphoreImpl
- {
- public:
- /*
- 建立一個訊號量,訊號量計數值當前值為引數n,最大值為max。
- 如果只有n,則n必須大於0;如果同時有n和max,則n必須不小
- 於0,且不大於max
- */
- CMySemaphore(int n);
- CMySemaphore(int n, int max);
- /*
- 銷燬一個訊號量
- */
- ~CMySemaphore();
- /*
- 對訊號量計數值做加1動作,訊號量變為有訊號狀態,使得
- 另一個等待該訊號量的執行緒可以被排程
- */
- void Set();
- /*
- 對訊號量計數值做減1動作,訊號量變為無訊號狀態。若
- 計數值變得大於0時,訊號量才會變為有訊號狀態。
- */
- void Wait();
- /*
- 在給定的時間間隔裡等待訊號量變為有訊號狀態,若成功,
- 則將計數值減1,否則將發生超時。
- */
- void Wait(long lMilliseconds);
- /*
- 在給定的時間間隔裡等待訊號量變為有訊號狀態,若成功,
- 則將計數值減1,返回true;否則返回false。
- */
- bool TryWait(long lMilliseconds);
- private:
- CMySemaphore();
- CMySemaphore(const CMySemaphore&);
- CMySemaphore& operator = (const CMySemaphore&);
- };
- inlinevoid CMySemaphore::Set()
- {
- SetImpl();
- }
- inlinevoid CMySemaphore::Wait()
- {
- WaitImpl();
- }
- inlinevoid CMySemaphore::Wait(long lMilliseconds)
- {
- if (!WaitImpl(lMilliseconds))
- cout<<"time out"<<endl;
- }
- inlinebool CMySemaphore::TryWait(long lMilliseconds)
- {
- return WaitImpl(lMilliseconds);
- }
- #endif
MySemaphore.cpp
- #include "MySemaphore.h"
- #include <sys/time.h>
- CSemaphoreImpl::CSemaphoreImpl(int n, int max): m_n(n), m_max(max)
- {
- assert (n >= 0 && max > 0 && n <= max);
- if (pthread_mutex_init(&m_mutex, NULL))
- cout<<"cannot create semaphore (mutex)"<<endl;
- if (pthread_cond_init(&m_cond, NULL))