windows系统调用 互斥体mutex

 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 }
原文地址:https://www.cnblogs.com/593213556wuyubao/p/3789074.html