SourceForge.jp

dkutilCriticalSection.h

説明を見る。
00001 
00007 #ifndef _dkutilCriticalSection__h_
00008 #define _dkutilCriticalSection__h_
00009 
00010 #include "dKingyoMacro.h"
00011 #include "dkutilDefinedC.h"
00012 
00013 namespace dkutil{
00014 
00015 #ifdef _MT //Multi Threadだったら。
00016 /*
00017 #   ifdef USE_DKINGYO_YANESDK3RD    //yaneSDK3rdを使うのなら
00018 
00019 class CriticalSectionManager : public CCriticalSection{
00020 public:
00021     CriticalSectionManager() : CCriticalSection(){}
00022     virtual ~CriticalSectionManager(){}
00023 };
00024 
00025 #   else ///yaneSDK3rdを使わないなら・・・
00026 */
00028 class CriticalSectionManager{
00029 public:
00030     void Init(){
00031         ::InitializeCriticalSection(&m_csCriticalSection);
00032         m_dwLockedThread = (DWORD)-1;
00033         mLockCount  = 0;
00034 #   ifdef _DEBUG
00035         ODS("Init CriticalSection");
00036 #   endif
00037     }
00038     explicit CriticalSectionManager(){
00039         Init();
00040     }
00041 
00042     virtual ~CriticalSectionManager(){
00043         ::DeleteCriticalSection(&m_csCriticalSection);
00044         if (mLockCount!=0) {
00045 #   ifdef USE_DKINGYO_THROW
00046             throw std::logic_error("CriticalSectionManagerをEnterした回数だけLeaveしないまま終了している");
00047 #   else
00048             MB("CriticalSectionManagerをEnterした回数だけLeaveしないまま終了している");
00049 #   endif
00050         }
00051 #       ifdef _DEBUG
00052         ODS("End CriticalSection");
00053 #       endif
00054     }
00055 
00057     void Enter(){
00058         ::EnterCriticalSection(&m_csCriticalSection);
00059         
00060         m_dwLockedThread = ::GetCurrentThreadId();
00061         //  ↑異なるスレッドからここに入ってくることはできない
00062         //  (CriticalSectionの定義より)
00063         mLockCount++;
00064 
00065     }
00066 
00068     void Leave(){
00069 
00070         if (mLockCount==0){
00071 #   ifdef USE_DKINGYO_THROW
00072             throw  std::logic_error("CriticalSectionManagerをEnterしていないのにLeaveしている");
00073 #   else
00074             MB("CriticalSectionManagerをEnterしていないのにLeaveしている");
00075 #   endif
00076         }
00077 
00078         if (--mLockCount==0) {
00079             m_dwLockedThread = (DWORD)-1;
00080         }
00081         //  ↑Leaveした直後に他スレッドがEnterする可能性がある
00082         ::LeaveCriticalSection(&m_csCriticalSection);
00083     }
00084 
00085     bool IsLockedByThisThread() const{
00086         DWORD dw = ::GetCurrentThreadId();
00087         return (m_dwLockedThread == dw);
00088     }
00089     
00090 protected:
00091     CRITICAL_SECTION m_csCriticalSection;
00092     DWORD               m_dwLockedThread;   //  LockしているThreadId(0:非Lock)
00093     int                 mLockCount;     //  Lockされている回数
00094             //  (同一スレッドならば複数回Lockできるので)
00095 };
00096 
00097 //# endif //end of USE_DKINGYO_YANESDK3RD   
00098 
00099 #else //Single Threadだったら・・・
00100 
00101 class CriticalSectionManager{
00102 public:
00103     CriticalSectionManager(){
00104 
00105     }
00106 
00107     virtual ~CriticalSectionManager(){
00108 
00109     }
00111     void Enter(){
00112     }
00114     void Leave(){
00115 
00116     }
00117 
00118     bool IsLockedByThisThread() const{
00119         return false;
00120     }
00121 protected:
00122 };
00123 
00124 #endif//end of _MT
00125 
00126 
00127 namespace private_{
00128 
00129 extern CriticalSectionManager &GetCriticalSection();
00130 
00131 }//end of private_ namespace
00132 
00133 
00134 }//end of dkutil namespace
00135 
00136 
00137 
00138 
00139 
00140 
00141 
00142 
00143 
00144 
00145 
00146 
00147 
00148 
00149 
00150 
00151 #endif //end of include once 

dkutil 1.02リリース前 d金魚専用マニュアルバージョンに対してSun Dec 28 21:23:07 2003に生成されました。 doxygen 1.3.5