WEB开发网
开发学院软件开发VC 线程同步--使用临界区 阅读

线程同步--使用临界区

 2006-07-20 11:37:40 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 临界区是一种保证在某一时刻只有一个线程能访问数据的简便办法,不管哪一个线程占用临界区对象,线程同步--使用临界区,它都可以访问受保护的数据,而其他线程就必须等待,本文即本人在学习多任务多线程过程的手记,供大家参考,直到占用临界区的线程进行释放操作,从而临界区的数据是不会一个以上的线程同

本文示例源代码或素材下载

临界区是一种保证在某一时刻只有一个线程能访问数据的简便办法。不管哪一个线程占用临界区对象,它都可以访问受保护的数据,而其他线程就必须等待,直到占用临界区的线程进行释放操作,从而临界区的数据是不会一个以上的线程同一时刻访问的。

在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退出了临界区,从而实现线程间的同步。

本文即本人在学习多任务多线程过程的手记,供大家参考,望能得到各位指点。

Tags:线程 同步 使用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接