www.pudn.com > OS.rar > 3-2.cpp
// mutex项目 # include# include // 利用互斥体来保护同时访问的共享资源 class CCountUpDown { public: // 创建者创建两个线程来访问共享值 CCountUpDown(int nAccesses): m_hThreadInc(INVALID_HANDLE_VALUE), m_hThreadDec(INVALID_HANDLE_VALUE), m_hMutexValue(INVALID_HANDLE_VALUE), m_nValue(0), m_nAccess(nAccesses) { // 创建互斥体用于访问数值 m_hMutexValue=::CreateMutex( NULL, // 缺省的安全性 TRUE, // 初始时拥有,在所有的初始化结束时将释放 NULL); // 匿名的 m_hThreadInc=::CreateThread( NULL, // 缺省的安全性 0, // 缺省堆栈 IncThreadProc, // 类线程进程 reinterpret_cast (this) , // 线程参数 0, // 无特殊的标志 NULL); // 忽略返回的id m_hThreadDec=::CreateThread( NULL, // 缺省的安全性 0, // 缺省堆栈 DecThreadProc, // 类线程进程 reinterpret_cast (this) , // 线程参数 0, // 无特殊的标志 NULL); // 忽略返回的id // 允许另一线程获得互斥体 ::ReleaseMutex(m_hMutexValue); } // 解除程序释放对对象的引用 virtual ~CCountUpDown() { ::CloseHandle(m_hThreadInc); ::CloseHandle(m_hThreadDec); ::CloseHandle(m_hMutexValue); } // 简单的等待方法,在两个线程终止之前可暂停主调者 virtual void WaitForCompletion() { // 确保所有对象都已准备好 if (m_hThreadInc!=INVALID_HANDLE_VALUE && m_hThreadDec!=INVALID_HANDLE_VALUE) { // 等待两者完成 (顺序并不重要) ::WaitForSingleObject(m_hThreadInc, INFINITE); ::WaitForSingleObject(m_hThreadDec, INFINITE); } } protected: // 改变共享资源的简单的方法 virtual void DoCount(int nStep) { // 循环,直到所有的访问都结束为止 while (m_nAccess > 0) { // 等待访问数值 :: WaitForSingleObject(m_hMutexValue, INFINITE); // 改变并显示该值 m_nValue+=nStep; std :: cout << "thread:" << :: GetCurrentThreadId() <<"value:"< (lpParam); // 调用对象的增加方法并返回一个值 pThis -> DoCount(+1); return(0); } static DWORD WINAPI DecThreadProc(LPVOID lpParam) { // 将参数解释为"this"指针 CCountUpDown* pThis = reinterpret_cast (lpParam); // 调用对象的减少方法并返回一个值 pThis -> DoCount(-1); return(0); } protected: HANDLE m_hThreadInc; HANDLE m_hThreadDec; HANDLE m_hMutexValue; int m_nValue; int m_nAccess; } ; void main() { CCountUpDown ud(50); ud.WaitForCompletion(); }