WEB开发网
开发学院软件开发VC VC++线程同步解析 阅读

VC++线程同步解析

 2012-08-10 14:21:29 来源:WEB开发网   
核心提示:下面通过一段代码展示了临界区在保护多线程访问的共享资源中的作用,通过两个线程来分别对全局变量g_cArray[10]进行写入操作,VC++线程同步解析(2),用临界区结构对象g_cs 来保持线程的同步,并在开启线程前对其进行初始化,使用该类进行线程同步处理是非常简单的,只需在线程函数中用CCriticalSection
下面通过一段代码展示了临界区在保护多线程访问的共享资源中的作用。通过两个线程来分
别对全局变量g_cArray[10]进行写入操作,用临界区结构对象g_cs 来保持线程的同步,并在
开启线程前对其进行初始化。为了使实验效果更加明显,体现出临界区的作用,在线程函数对共
享资源g_cArray[10]的写入时,以Sleep()函数延迟1 毫秒,使其他线程同其抢占CPU 的
可能性增大。如果不使用临界区对其进行保护,则共享资源数据将被破坏,而使用临界区对线程保持同步后则可以得到正确的结果。代码实现清单附下:
// 临界区结构对象
CRITICAL_SECTION g_cs;
// 共享资源
char g_cArray[10];
UINT ThreadProc10(LPVOID pParam)
{
// 进入临界区
EnterCriticalSection(&g_cs);
// 对共享资源进行写入操作
for (int i = 0; i < 10; i++)
{
g_cArray[i] = 'a';
Sleep(1);
}
// 离开临界区
LeaveCriticalSection(&g_cs);
return 0;
}
UINT ThreadProc11(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 CSample08View::OnCriticalSection()
{
// 初始化临界区
InitializeCriticalSection(&g_cs);
// 启动线程
AfxBeginThread(ThreadProc10, NULL);
AfxBeginThread(ThreadProc11, NULL);
// 等待计算完毕
Sleep(300);
// 报告计算结果
CString sResult = CString(g_cArray);
AfxMessageBox(sResult);
}
在使用临界区时,一般不允许其运行时间过长,只要进入临界区的线程还没有离开,其他所有试图进入此临界区的线程都会被挂起而进入到等待状态,并会在一定程度上影响。程序的运行性能。尤其需要注意的是不要将等待用户输入或是其他一些外界干预的操作包含到临界区。如果进入了临界区却一直没有释放,同样也会引起其他线程的长时间等待。换句话说,在执行了EnterCriticalSection()语句进入临界区后无论发生什么,必须确保与之匹配的LeaveCriticalSection()都能够被执行到。可以通过添加结构化异常处理代码来确保LeaveCriticalSection()语句的执行。虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。
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;

上一页  1 2 3 4 5 6 7  下一页

Tags:VC 线程 同步

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