Visual C++ 中的结构异常处理
2008-11-13 19:29:21 来源:WEB开发网在函数Funcenstein1中,我们使用了try-finally程序块。但是它们并没有为我们做多少工作:等待一个指示灯信号,改变保护数据的内容,将新的数据指定给一个局域变量dwTemp,释放指示灯信号,返回新的数据给调用函数。
2.2.2、例2--Funcenstein2
现在让我们对Funcenstein1稍稍做一些改动,看看会出现什么情况(见清单二)。
DWORD Funcenstein2(void) {
例2 Funcenstein2函数代码
DWORD dwTemp;
// 1. Do any processing here.
.
.
.
__try {
// 2. request permission to access protected data, and then use it.
WaitForSingleObject(g_hSem, INFINITE);
g_dwProtectedData = 5;
dwTemp = g_dwProtectedData;
// Return the new value.
return (dwTemp);
}
__finally {
// 3. Allow others to use protected data.
ReleaseSemaphore(g_hSem, 1, NULL);
}
// 4. Continue processing--this code will never execute in this version.
dwTemp = 9;
return (dwTemp);
}
在函数Funcenstein2中,我们在try程序段里加入了一个return返回语句。该返回语句告诉编译器,你想离开函数Funcenstein2并返回dwTemp内的内容5给调用函数。然而,如果此返回语句被执行,本线程永远不会释放指示灯信号,其它线程也就永远不会得到该指示灯信号。你可以想象,在多线程程序中这是一个多么严重的问题。
但是,使用了中断处理句柄避免了这种情况发生。当返回语句试图离开try程序段时,编译器保证了在finally程序段内的代码得到执行。所以,finally程序段内的代码保证会在try程序段中的返回语句前执行。在函数Funcenstein2中,将调用ReleaseSemaphore放在finally程序段内保证了指示灯信号会得到释放。
- ››Visual Basic 2008 数学函数
- ››Visual Studio2005中Smart Device的问题
- ››Visual Studio 中根据数据库字段动态生成控件
- ››Visual Studio 11全新黑色主题
- ››Visual Studio 2011 Beta新特性(一):安装VS201...
- ››结构体边界对齐
- ››Visual Studio自定义调试窗体两个小技巧
- ››Visual Studio 2005 Team Edition for Database P...
- ››Visual C#两分钟搭建BHO IE钩子
- ››Visual C++优化对大型数据集合的并发访问
- ››VISUAL C++中的OCX控件的使用方法
- ››Visual C++实现视频图像处理技术
更多精彩
赞助商链接