网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.

C++线程同步学习②临界区与信号量


接上一篇(http://www.youranshare.com/blog/sid/38.html),线程的同步一般使用了4种方式,互斥(CMutex)、临界(CriticalSection)、信号量(Semaphore)、事件(Event),上一篇中已经写了一个CMutex的示例代码,剩下的3种与之类似,都是创建、加锁、释放锁定。

      所以在本文中就简单的介绍了剩下的三种的使用方法:

·    临界(CriticalSection)

  Win32中的使用:

// 临界区结构对象
CRITICAL_SECTION hCritical;
// 共享资源
char iArray[10];
UINT ThreadProc10(LPVOID pParam)
{
       // 进入临界区
       EnterCriticalSection(&hCritical);
       // 对共享资源进行写入操作
       for (int i = 0; i < 10; i++)
       {
              iArray = a;
              Sleep(1);
       }
       // 离开临界区
       LeaveCriticalSection(&hCritical);
       return 0;
}
UINT ThreadProc11(LPVOID pParam)
{
       // 进入临界区
       EnterCriticalSection(&hCritical);
       // 对共享资源进行写入操作
       for (int i = 0; i < 10; i++)
       {
              iArray[10 - i - 1] = b;
              Sleep(1);
       }
       // 离开临界区
       LeaveCriticalSection(&hCritical);
       return 0;
}
 
void CSample08View::OnCriticalSection()
{
       // 初始化临界区
       InitializeCriticalSection(&hCritical);
       // 启动线程
       AfxBeginThread(ThreadProc10, NULL);
       AfxBeginThread(ThreadProc11, NULL);
       // 等待计算完毕
       Sleep(300);
       // 报告计算结果
       CString sResult = CString(iArray);
       AfxMessageBox(sResult);
}


  MFC中的临界区使用:

//临界对象
CCriticalSection criticalSection; 
UINT MessageThread1(LPVOID pParam) 
{ 
       //锁定
       criticalSection.Lock(); 
       //你的操作.........
       //......
       //释放
       criticalSection.Unlock(); 
       return 0; 
} 
UINT MessageThread2(LPVOID pParam) 
{ 
       //锁定
       criticalSection.Lock(); 
       //你的操作.........
       //......
       //释放
       criticalSection.Unlock(); 
       return 0; 
} 
//创建开启线程
void CThreadTestView::OnLButtonDown(UINT nFlags, CPoint point) 
{ 
       AfxBeginThread(MessageThread1, _T("Thread is started")); //启动线程1 
       AfxBeginThread(MessageThread2, _T("Thread is started")); //启动线程2 
}


·    信号量(Semaphore)

  Win32下的使用:

//这个东东跟win32的互斥体使用是一样的
HANDLE hSe;
//初始化的时候使用这个函数
hSe  = CreateSemaphore(NULL,1,1,NULL);
 
//等待
WaitForSingleObject(hSe,INFNITE);
 
//释放
ReleaseSemaphore(hSe,1,NULL);
②  MFC下使用信号量:
//同样,和互斥体的使用一样
CSemaphore cSemap;
//锁定
cSemap.Lock();
//解锁
cSemap.Unlock();


·    事件(Event)

   Win32下的使用:

//依然类似 互斥体,只有创建释放的时候有所不同
HANDLE hEve=NULL;
//创建一个事件
hEve = CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(hEve);
 
//等待
WaitForSingleObject(hEve,INFINITE);
 
//”释放”~~~应该成为 设置Event
SetEvent(hEve);


  MFC下的使用

CEvent cEve;
 
//锁定
cEve.Lock();
 
//”释放”
cEve.SetEvent();



·    总结:

    线程的同步总的来说就是一把钥匙开一把锁,我拿着钥匙,你就得等我用完钥匙,转交给你后你才能使用,否则你就只能等着,知道我把钥匙交给你为止.


本文出自悠然品鉴,转载请注明出处!



  • 标签:
  • 线程同步
  • C++
  • MFC
网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.