程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 線程同步--使用臨界區

線程同步--使用臨界區

編輯:關於VC++

臨界區是一種保證在某一時刻只有一個線程能訪問數據的簡便辦法。不管哪一個線程占用臨界區對象,它都可以訪問受保護的數據,而其他線程就必須等待,直到占用臨界區的線程進行釋放操作,從而臨界區的數據是不會一個以上的線程同一時刻訪問的。

在MFC中通過CCtiticalSection類來創建臨界區實例,如:CCriticalSection CriticalSection;

當線程准備訪問臨界區的數據時,必須調用它的成員函數Lock()進行鎖定,如: CriticalSecion.Lock();如果沒有任何線程占用臨界區,Lock()可以向調用純種提供臨界區數據的訪問,當線程完成各項數據操作後,再調用成員函數UnLock()進行釋放,別的線程才可以占用臨界區。如: CriticalSection.UnLock();可以定義一個數據實例:class CDataArray
{
private:
  int iArray[10];
  CCriticalSection CriticalSection;
public:
  CDataArray(){};
  ~CDataArray(){};
  void SetData(int iValue);
  void GetDataArray(int aArray[10]);
};

在頭文件中必須包含afxmt.h,它提供了程序對CCriticalSection的訪問機制。void CDataArray::SetData(int iValue)
{
  CriticalSection.Lock();
  for (int i=0;i<10;i++)
    iArray[i]=iValue;
  CriticalSection.Unlock();
}
void CDataArray::GetDataArray(int aArray[10])
{
  CriticalSection.Lock();
  for (int i=0;i<10;i++)
    aArray[i]=iArray[i];
  CriticalSection.Unlock();
}

增加數據實例:CDataArray DataArray;

再編寫讀寫函數:UINT Thread_WriteProc(LPVOID param)
{
  for (int i=0;i<10;i++)
  {
    DataArray.SetData(i);
    ::Sleep(500);
  }
  return 0;
}
UINT Thread_ReadProc(LPVOID param)
{
  int aArray[10];
  for (int i=0;i<20;i++)
  {
    DataArray.GetDataArray(aArray);
    char str[255];
    str[0]=0;
    for (int j=0;j<10;j++)
    {
      int len=strlen(str);
      wsprintf(&str[len],"%d",aArray[j]);
    }
    ::MessageBox((HWND)param,str,"Thread Read Proc",MB_OK);
  }
  return 0;
}

這樣我們可以啟動這兩個線程函數:HWND hWnd=GetSafeHwnd();
AfxBeginThread(Thread_WriteProc,hWnd);
AfxBeginThread(Thread_ReadProc,hWnd);
這樣當Thread_WriteProc占用臨界區時,Thread_ReadProc必須等待,直到Thread_WriteProc退出了臨界區,從而實現線程間的同步。

本文即本人在學習多任務多線程過程的手記,供大家參考,望能得到各位指點。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved