1.MFC为临界区提供有一个CCriticalSection类,使用该类进行线程同步处理是非常简单的,只需在线程函数中使用CCriticalSection类成员函数Lock()和UnLock()标定出被保护代码片段即可。使用CCriticalSection类实现同步代码如下:
//MFC临界区类对象
CCriticalSection g_clsCriticalSection;
//共享资源
char g_cArray[10];
UINT ThreadProc20(LPVOID pParam)
{
//进入临界区
g_clsCriticalSection.Lock();
//对共享资源进行写入操作
for(int i=0; i<10;i++)
{
g_cArray[i] = 'a';
Sleep(1);
}
//离开临界区
g_clsCriticalSection.Unlock();
return 0;
}
UINT ThreadProc21(LPVOID pParam)
{
//进入临界区
g_clsCriticalSection.Lock();
//对共享资源进行写入操作
for(int i=0; i<10;i++)
{
g_cArray[10-i-1] = 'b';
Sleep(1);
}
//离开临界区
g_clsCriticalSection.Unlock();
return 0;
}
//创建线程调用
void CSample08View::OnCriticalSectionMFC()
{
//启动线程
AfxBeginThread(ThreadProc20,NULL);
AfxBeginThread(ThreadProc21,NULL);
//等待继续按完毕
Sleep(300);
//报告计算结果
CString sResult = CString(g_cArray);
AfxMessageBox(sResult);
}
2.使用事件内核对象来实现线程同步 CreateEvent
//事件句柄
HANDLE hEvent = NULL;
//共享资源
char g_cArray[10];
UINT ThreadProc20(LPVOID pParam)
{
//等待事件置位
WaitForSingleObject(hEvent,INFINITE);
//对共享资源进行写入操作
for(int i=0; i<10;i++)
{
g_cArray[i] = 'a';
Sleep(1);
}
//处理完成后即将事件对象置位
SetEvent(hEvent);
return 0;
}