假设是写操作,则会错误发生。这时候,我们能够通过临界区,为全局变量设置一个保护,保证同一时候仅仅有一个线程能够訪问此变量。其它变量进入等待状态。
临界区在使用时以CRITICAL_SECTION结构对象保护共享资源,并分别用 ①InitializeCriticalSection(&cs); //初始化临界区②EnterCriticalSection(&cs);//进入临界区③LeaveCriticalSection(&cs);//离开临界区④DeleteCriticalSection(&cs);//删除临界区
一般类程序(举例)
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);
}
能够通过加入结构化异常处理代码来确保LeaveCriticalSection
()语句的执行。尽管临界区同步速度非常快,但却仅仅能用来同步本进程内的线程,而不可用来同步多个进程中的线程。
MFC为临界区提供有一个CCriticalSection类,使用该类进行线程同步处理是非常easy的,仅仅需在线程函数中用CCriticalSection类成员函数 Lock()和UnLock()标定出被保护代码片段就可以。对于上述代码,可通过CCriticalSection类将其改写例如以下:
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);
}