1 #include "iostream" 2 #include "windows.h" 3 using namespace std; 4 5 class CCountUpDown{ 6 public: 7 CCountUpDown(int nAccesses): 8 m_hThreadInc(INVALID_HANDLE_VALUE), 9 m_hThreadDec(INVALID_HANDLE_VALUE), 10 m_hMutexValue(INVALID_HANDLE_VALUE), 11 m_nValue(0), 12 m_nAccess(nAccesses){ 13 m_hMutexValue=CreateMutex( 14 NULL, 15 TRUE, 16 NULL 17 ); 18 m_hThreadInc=CreateThread( 19 NULL, 20 0, 21 IncThreadProc, 22 reinterpret_cast<LPVOID>(this), 23 0, 24 NULL 25 ); 26 m_hThreadDec=CreateThread( 27 NULL, 28 0, 29 DecThreadProc, 30 reinterpret_cast<LPVOID>(this), 31 0, 32 NULL 33 ); 34 ReleaseMutex(m_hMutexValue); 35 } 36 37 virtual ~CCountUpDown(){ 38 CloseHandle(m_hThreadInc); 39 CloseHandle(m_hThreadDec); 40 CloseHandle(m_hMutexValue); 41 } 42 43 virtual void WaitForCompletion(){ 44 if(m_hThreadInc!=INVALID_HANDLE_VALUE&&m_hThreadDec!=INVALID_HANDLE_VALUE){ 45 WaitForSingleObject(m_hThreadInc,INFINITE); 46 WaitForSingleObject(m_hThreadDec,INFINITE); 47 } 48 } 49 50 protected: 51 virtual void DoCount(int nStep){ 52 while(m_nAccess>0){ 53 WaitForSingleObject(m_hMutexValue,INFINITE); 54 55 m_nValue+=nStep; 56 printf("thread:%d valuem,value:%d access:%d ",GetCurrentThreadId(),m_nValue,m_nAccess); 57 --m_nAccess; 58 Sleep(500); 59 60 ReleaseMutex(m_hMutexValue); 61 } 62 } 63 64 static DWORD WINAPI IncThreadProc(LPVOID lpParam){ 65 CCountUpDown *pThis=reinterpret_cast<CCountUpDown*>(lpParam); 66 pThis->DoCount(+1); 67 return (0); 68 } 69 70 static DWORD WINAPI DecThreadProc(LPVOID lpParam){ 71 CCountUpDown*pThis=reinterpret_cast<CCountUpDown*>(lpParam); 72 pThis->DoCount(-1); 73 return(0); 74 } 75 76 protected: 77 HANDLE m_hThreadInc; 78 HANDLE m_hThreadDec; 79 HANDLE m_hMutexValue; 80 int m_nValue; 81 int m_nAccess; 82 }; 83 84 void main(){ 85 CCountUpDown ud(10); 86 ud.WaitForCompletion(); 87 getchar(); 88 }