//?临界区结构对象
CRITICAL_SECTION?g_cs;
//?共享资源?
char?g_cArray[10]
UINT?ThreadProc1(LPVOID?pParam)
{
//?进入临界区
EnterCriticalSection(&g_cs);
//?对共享资源进行写入操作
for?(int?i?=?0;?i?<?10;?i++)
{
g_cArray[i]?=?’a’;
Sleep(1);
}
//?离开临界区
LeaveCriticalSection(&g_cs);
return?0;
}
UINT?ThreadProc2(LPVOID?pParam)
{
//?进入临界区
EnterCriticalSection(&g_cs);
//?对共享资源进行写入操作
for?(int?i?=?0;?i?<?10;?i++)
{
g_cArray[10?-?i?-?1]?=?’b’;
Sleep(1);
}
//?离开临界区
LeaveCriticalSection(&g_cs);
return?0;
}
void?CSampleView::OnCriticalSection()?
{
//?初始化临界区
InitializeCriticalSection(&g_cs);
//?启动线程
AfxBeginThread(ThreadProc1,?NULL);
AfxBeginThread(ThreadProc2,?NULL);
//?等待计算完成
Sleep(300);
//?报告计算结果
CString?sResult?=?CString(g_cArray);
AfxMessageBox(sResult);
}
程序的执行性能。
尤其须要注意的是不要将等待用户输入或是其它一些外界干预的操作包括到临界区。假设进入了临界区却一直没有释放。相同也会引起其它线程的长时间等待。换句话说,在执行了EnterCriticalSection()语句进入临界区后不管发生什么,必须确保与之匹配的LeaveCriticalSection()都能够被执行到。能够通过加入结构化异常处理代码来确保LeaveCriticalSection ()语句的执行。尽管临界区同步速度非常快。但却仅仅能用来同步本进程内的线程。而不可用来同步多个进程中的线程。
??????
??????MFC为临界区提供有一个CCriticalSection类,使用该类进行线程同步处理是非常easy的,仅仅需在线程函数中用CCriticalSection类成员函数 Lock()和UnLock()标定出被保护代码片段就可以。
对于上述代码,可通过CCriticalSection类将其改写例如以下:
???????MFC应用(举例)
//?MFC临界区类对象
CCriticalSection?g_cs;
//?共享资源?
char?g_cArray[10];
UINT?ThreadProc1(LPVOID?pParam)
{
//?进入临界区
g_cs.Lock();
//?对共享资源进行写入操作
for?(int?i?=?0;?i?<?10;?i++)
{
g_cArray[i]?=?’a’;
Sleep(1);
}
//?离开临界区
g_cs.Unlock();
return?0;
}
UINT?ThreadProc2(LPVOID?pParam)
{
//?进入临界区
g_cs.Lock();
//?对共享资源进行写入操作
for?(int?i?=?0;?i?<?10;?i++)
{
g_cArray[10?-?i?-?1]?=?’b’;
Sleep(1);
}
//?离开临界区
g_cs.Unlock();
return?0;
}
void?CSampleView::OnCriticalSectionMfc()?
{
//?启动线程
AfxBeginThread(ThreadProc1,?NULL);
AfxBeginThread(ThreadProc2,?NULL);
//?等待计算完成
Sleep(300);
//?报告计算结果
CString?sResult?=?CString(g_cArray);
AfxMessageBox(sResult);
}原文:https://www.cnblogs.com/ldxsuanfa/p/10486388.html