涉及Windows 2000 / XP中关键部分的错误行为

时间:2012-05-28 13:09:21

标签: winapi critical-section c++builder-6

最近我试图在Windows 7 x64上运行一个旧应用程序(用Borland C ++ Builder 6编写),发现IO线程无效。调试显示问题在于错误处理类没有离开临界区(间接地,通过简单的包装类),因此添加到日志的每条消息都导致两次调用EnterCriticalSection但只调用一次LeaveCriticalSection

在我看来,这个错误应该使该类无法使用,但它是原始开发人员积极使用的常见类之一,并且此特定应用程序在Windows 2000 / XP中始终正常工作。所以问题是为什么这个错误只出现在Windows 7中?

我在这里阅读了关于关键部分和建议问题的MSDN文章,唯一指出的行为变化是未定义获取订单,绝对不是这样。

1 个答案:

答案 0 :(得分:1)

我使用C ++ Builder 6,我的应用程序可以正常使用Windows 7 64位上的关键部分。所以你的问题必须是应用程序中的错误,而不是API。如果线程调用EnterCriticalSection()并成功获得锁定但未调用LeaveCriticalSection(),则后续线程会自行调用EnterCriticalSection()。因此,您必须继续调试以找出原始线程在应该调用LeaveCriticalSection()时未调用的原因。每次调用EnterCriticalSection()都必须与对LeaveCriticalSection()的调用保持平衡,特别是如果它们是嵌套的。