WEB开发网
开发学院软件开发VC Visual C++中的结构异常处理 阅读

Visual C++中的结构异常处理

 2010-05-25 20:36:09 来源:WEB开发网   
核心提示:2.2、几个例子下面我们通过几个具体例子来讨论中断处理句柄是如何工作的,2.2.1、例1--Funcenstein1清单一给出了我们的第一个例子,Visual C++中的结构异常处理(2),DWORD Funcenstein1(void) {DWORD dwTemp;// 1. Do any processing he

2.2、几个例子

下面我们通过几个具体例子来讨论中断处理句柄是如何工作的。

2.2.1、例1--Funcenstein1

清单一给出了我们的第一个例子。

DWORD Funcenstein1(void) {
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;

__finally {
// 3. Allow others to use protected data.
ReleaseSemaphore(g_hSem, 1, NULL);

// 4. Continue processing.
return (dwTemp);

例1 Funcenstein1函数代码

在函数Funcenstein1中,我们使用了try-finally程序块。但是它们并没有为我们做多少工作:等待一个指示灯信号,改变保护数据的内容,将新的数据指定给一个局域变量dwTemp,释放指示灯信号,返回新的数据给调用函数。

2.2.2、例2--Funcenstein2

现在让我们对Funcenstein1稍稍做一些改动,看看会出现什么情况(见清单二)。

DWORD Funcenstein2(void) {
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);
  例2 Funcenstein2函数代码

在函数Funcenstein2中,我们在try程序段里加入了一个return返回语句。该返回语句告诉编译器,你想离开函数Funcenstein2并返回dwTemp内的内容5给调用函数。然而,如果此返回语句被执行,本线程永远不会释放指示灯信号,其它线程也就永远不会得到该指示灯信号。你可以想象,在多线程程序中这是一个多么严重的问题。

但是,使用了中断处理句柄避免了这种情况发生。当返回语句试图离开try程序段时,编译器保证了在finally程序段内的代码得到执行。所以,finally程序段内的代码保证会在try程序段中的返回语句前执行。在函数Funcenstein2中,将调用ReleaseSemaphore放在finally程序段内保证了指示灯信号会得到释放。

在finally程序段内的代码被执行后,函数Funcenstein2立即返回。这样,因为try程序段内的return返回语句,任何finally程序段后的代码都不会被执行。因而Funcenstein2返回值是5,而不是9。

必须指出的是,当遇到例2中这种过早返回语句时,编译器需要产生额外的代码以保证finally程序段内的代码的执行。此过程称作为局域展开。当然,这必然会降低整个程序的效率。所以,你应该尽量避免使用这类代码。在后面我们会讨论关键词__leave,它可以帮助我们避免编写出现局域展开一类的代码。

上一页  1 2 3 4  下一页

Tags:

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