最近我试图在Windows 7 x64上运行一个旧应用程序(用Borland C ++ Builder 6编写),发现IO线程无效。调试显示问题在于错误处理类没有离开临界区(间接地,通过简单的包装类),因此添加到日志的每条消息都导致两次调用EnterCriticalSection
但只调用一次LeaveCriticalSection
。
在我看来,这个错误应该使该类无法使用,但它是原始开发人员积极使用的常见类之一,并且此特定应用程序在Windows 2000 / XP中始终正常工作。所以问题是为什么这个错误只出现在Windows 7中?
我在这里阅读了关于关键部分和建议问题的MSDN文章,唯一指出的行为变化是未定义获取订单,绝对不是这样。
答案 0 :(得分:1)
我使用C ++ Builder 6,我的应用程序可以正常使用Windows 7 64位上的关键部分。所以你的问题必须是应用程序中的错误,而不是API。如果线程调用EnterCriticalSection()
并成功获得锁定但未调用LeaveCriticalSection()
,则后续线程会自行调用EnterCriticalSection()
。因此,您必须继续调试以找出原始线程在应该调用LeaveCriticalSection()
时未调用的原因。每次调用EnterCriticalSection()
都必须与对LeaveCriticalSection()
的调用保持平衡,特别是如果它们是嵌套的。