使用互斥對象實現線程同步

 

使用互斥對象實現線程同步
  互斥對象屬於系統內核對象,它能夠使線程擁有對某個資源的絕對訪問權。互斥對象主要包含使用

數量,線程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
 
}

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章