?? 3-2.cpp
字號(hào):
// mutex項(xiàng)目
# include <windows.h>
# include <iostream>
// 利用互斥體來保護(hù)同時(shí)訪問的共享資源
class CCountUpDown
{
public:
// 創(chuàng)建者創(chuàng)建兩個(gè)線程來訪問共享值
CCountUpDown(int nAccesses):
m_hThreadInc(INVALID_HANDLE_VALUE),
m_hThreadDec(INVALID_HANDLE_VALUE),
m_hMutexValue(INVALID_HANDLE_VALUE),
m_nValue(0),
m_nAccess(nAccesses)
{
// 創(chuàng)建互斥體用于訪問數(shù)值
m_hMutexValue=::CreateMutex(
NULL, // 缺省的安全性
TRUE, // 初始時(shí)擁有,在所有的初始化結(jié)束時(shí)將釋放
NULL); // 匿名的
m_hThreadInc=::CreateThread(
NULL, // 缺省的安全性
0, // 缺省堆棧
IncThreadProc, // 類線程進(jìn)程
reinterpret_cast<LPVOID>(this) , // 線程參數(shù)
0, // 無(wú)特殊的標(biāo)志
NULL); // 忽略返回的id
m_hThreadDec=::CreateThread(
NULL, // 缺省的安全性
0, // 缺省堆棧
DecThreadProc, // 類線程進(jìn)程
reinterpret_cast<LPVOID>(this) , // 線程參數(shù)
0, // 無(wú)特殊的標(biāo)志
NULL); // 忽略返回的id
// 允許另一線程獲得互斥體
::ReleaseMutex(m_hMutexValue);
}
// 解除程序釋放對(duì)對(duì)象的引用
virtual ~CCountUpDown()
{
::CloseHandle(m_hThreadInc);
::CloseHandle(m_hThreadDec);
::CloseHandle(m_hMutexValue);
}
// 簡(jiǎn)單的等待方法,在兩個(gè)線程終止之前可暫停主調(diào)者
virtual void WaitForCompletion()
{
// 確保所有對(duì)象都已準(zhǔn)備好
if (m_hThreadInc!=INVALID_HANDLE_VALUE && m_hThreadDec!=INVALID_HANDLE_VALUE)
{
// 等待兩者完成 (順序并不重要)
::WaitForSingleObject(m_hThreadInc, INFINITE);
::WaitForSingleObject(m_hThreadDec, INFINITE);
}
}
protected:
// 改變共享資源的簡(jiǎn)單的方法
virtual void DoCount(int nStep)
{
// 循環(huán),直到所有的訪問都結(jié)束為止
while (m_nAccess > 0)
{
// 等待訪問數(shù)值
:: WaitForSingleObject(m_hMutexValue, INFINITE);
// 改變并顯示該值
m_nValue+=nStep;
std :: cout << "thread:" << :: GetCurrentThreadId()
<<"value:"<<m_nValue<<"access:" << m_nAccess << std :: endl;
// 發(fā)出訪問信號(hào)并允許線程切換
--m_nAccess;
:: Sleep(1000);
// 釋放對(duì)數(shù)值的訪問
:: ReleaseMutex(m_hMutexValue);
}
}
static DWORD WINAPI IncThreadProc(LPVOID lpParam)
{
// 將參數(shù)解釋為 "this" 指針
CCountUpDown* pThis=reinterpret_cast<CCountUpDown*>(lpParam);
// 調(diào)用對(duì)象的增加方法并返回一個(gè)值
pThis -> DoCount(+1);
return(0);
}
static DWORD WINAPI DecThreadProc(LPVOID lpParam)
{
// 將參數(shù)解釋為"this"指針
CCountUpDown* pThis = reinterpret_cast<CCountUpDown*>(lpParam);
// 調(diào)用對(duì)象的減少方法并返回一個(gè)值
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();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -