entercriticalsection

有这么个问题

有读者问:发生异常时,如果不知道是否清理临界区对象,合适的异常处理方法是什么?

读者的问题是这样的:
“我正在使用SEH,我在代码中使用__try/__except块来保护进出临界区的代码。出现异常的时候,我不知道自己是还在临界区还是已经出来了。甚至用_ _ try/_ _最后也解决不了我的
问题。”

答:你可以知道自己是否有临界区对象,因为一旦进入,就意味着获得了临界区对象。

方法1:通过指令指针进行判断

“如果代码在这里执行,就意味着我一定在临界区.”

entercriticalsection

请注意,对于嵌套调用EnterCriticalSection,上述方法也可以正常工作。
如果您再次获得临界区,您必须记住将调用包含在它自己的try/finally结构中。

方法2:通过栈变量进行判断

“我记得我是否进入了临界区”[br/]

上述方法也可以应用于嵌套调用EnterCriticalSection的情况。只要记住,每得到一个临界面积对象,就要在居中上加1。

方法3:通过对象来进行追踪

将CRITICAL_SECTION封装到一个对象中。
这种方法最适合上述读者。

请注意,上述代码不适用于嵌套临界区的情况。如果您尝试两次获取临界区对象,异常处理程序将只退出临界区一次。

还请注意,我们认为临界区不是在初始状态获得的,而是添加了一个断言。如果碰巧已经获得了临界区,我们的清理代码会尝试退出临界区,但实际上并没有进入。(试想一下,如果第一个“……”有例外。)

方法4:通过智能对象判断

通过将CRITICAL_SECTION对象封装到智能对象中。
可以在上面的代码中添加以下方法:DWORD Depth() {return Owned()?m _ dw depth:0;}

代码如下:

在关键区域发生异常时进行清理,会引出这样一个问题:我怎么知道清理操作是安全的?
你使用临界区,意味着你想独占使用一个数据结构,但是如果你在得到临界区时发现异常,此时数据结构的状态是不稳定的。如果简单的退出临界区会导致数据结构进入不一致状态,那么就会导致一个很难诊断的问题:为什么我的引用计数不同步?
我稍后会详细讨论异常。

最后

Raymond Chen的“The Old New Thing”是我最喜欢的博客之一,里面包含了很多关于Windows的小知识,对于Windows平台的开发者来说真的很有帮助。
这篇文章来自:“如果不支持我查看内部字段,我如何确定我在哪里拥有一个临界区?》

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论