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

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

 2008-11-13 19:29:21 来源:WEB开发网   
核心提示: 在函数Funcenstein1中,我们使用了try-finally程序块,Visual C++ 中的结构异常处理(3),但是它们并没有为我们做多少工作:等待一个指示灯信号,改变保护数据的内容,finally程序段内的代码保证会在try程序段中的返回语句前执行,在函数Funcenstein2

在函数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程序段内保证了指示灯信号会得到释放。

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

Tags:Visual 结构 异常

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