使用互斥對象實現線程同步
互斥對象屬於系統內核對象,它能夠使線程擁有對某個資源的絕對訪問權。互斥對象主要包含使用
數量,線程ID和遞歸計數器等信息。其中線程ID表示當前擁有互斥對象的線程,遞歸計數器表示線程
擁有互斥對象的次數。
互斥對象的使用方式:當互斥對象的線程ID爲0時,表示互斥對象不被任何線程擁有,此時系統會
發出該互斥對象的通知信號。等待互斥對象的某個線程將會擁有該互斥對象,同時互斥對象的線程ID
爲擁有該互斥對象線程的ID。
當互斥對象的線程ID不是0時,表示當前有線程擁有該互斥對象。系統不會發
出互斥對象的通知信號。其他等待互斥對象的線程繼續等待,直到擁有互斥對象的線程釋放互斥對象
的擁有權
相關函數:
CreateMutex:創建互斥對象
HANDLE CreateMutex(LPSECURITY_ATTRBUTES,lpMutexAttributes,BOOL bInitialOwner,
LPCTSTR lpName)
lpMutexAttributes:表示互斥對象的安全屬性,可以爲NULL;
bInitialOwner:表示互斥對象的初始狀態。如果是TRUE,互斥對象的線程ID爲當前調用
線程的ID,互斥對象的遞歸計數器爲1,當前創建互斥對象的哦線程擁
有互斥對象的擁有權。如果是FALSE,互斥對象的的ID是0,計數器爲
0,系統會發出該互斥對象的通知信號
ReleaseMutes;釋放互斥對象的擁有權
BOOL ReleaseMutex(HANDLE hMutex)
WaitForSingleObject:獲得互斥對象,具體見事件對象一節中
DWORD WaitForSingleObject( HANDLE hHandle,DWORD dwMillseconds);
示例:
UINT output11(LPVOID pThreadParam)
{
CString text;
CAccessConflictDlg *pdlg=(CAccessConflictDlg *)pThreadParam;
while(pdlg->m_count<=100)
{
WaitForSingleObject(pdlg->m_mutex,INFINITE);//等待事件對象
text.Format("線程一輸出%d",pdlg->m_count);
pdlg->m_count++;
pdlg->m_list.AddString(text);
Sleep(100);
ReleaseMutex(pdlg->m_mutex);
}
return 0;
}
UINT output22(LPVOID pThreadParam)
{
CString text;
CAccessConflictDlg *pdlg=(CAccessConflictDlg *)pThreadParam;
while(pdlg->m_count<=100)
{
WaitForSingleObject(pdlg->m_mutex,INFINITE);//等待事件對象
text.Format("線程二輸出%d",pdlg->m_count);
pdlg->m_count++;
pdlg->m_list.AddString(text);
Sleep(100);
ReleaseMutex(pdlg->m_mutex);
}
return 0;
}
void CAccessConflictDlg::OnButton1()
{
m_mutex=CreateMutex(NULL,FALSE,"MUTEX");
output1=AfxBeginThread(output11,this,0,0,0,NULL);
output2=AfxBeginThread(output22,this,0,0,0,NULL);
CloseHandle(output1->m_hThread);
CloseHandle(output2->m_hThread);
// TODO: Add your control notification handler code here
}