?? 3-2.cpp
字號:
// mutex項目
# include <windows.h>
# include <iostream>
// 利用互斥體來保護同時訪問的共享資源
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<LPVOID>(this) , // 線程參數
0, // 無特殊的標志
NULL); // 忽略返回的id
m_hThreadDec=::CreateThread(
NULL, // 缺省的安全性
0, // 缺省堆棧
DecThreadProc, // 類線程進程
reinterpret_cast<LPVOID>(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:"<<m_nValue<<"access:" << m_nAccess << std :: endl;
// 發出訪問信號并允許線程切換
--m_nAccess;
:: Sleep(1000);
// 釋放對數值的訪問
:: ReleaseMutex(m_hMutexValue);
}
}
static DWORD WINAPI IncThreadProc(LPVOID lpParam)
{
// 將參數解釋為 "this" 指針
CCountUpDown* pThis=reinterpret_cast<CCountUpDown*>(lpParam);
// 調用對象的增加方法并返回一個值
pThis -> DoCount(+1);
return(0);
}
static DWORD WINAPI DecThreadProc(LPVOID lpParam)
{
// 將參數解釋為"this"指針
CCountUpDown* pThis = reinterpret_cast<CCountUpDown*>(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();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -