0

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

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

我在这里阅读了有关关键部分和建议问题的 MSDN 文章,唯一注意到的行为变化是未定义的获取顺序,这绝对不是这种情况。

4

1 回答 1

1

我使用 C++Builder 6,我的应用程序在 Windows 7 64 位的关键部分上运行良好。因此,您的问题必须是由于应用程序中的错误,而不是 API 中的错误。如果一个线程调用EnterCriticalSection()并成功获得了锁但没有调用LeaveCriticalSection(),后续线程会在自己的调用上死锁EnterCriticalSection()。因此,您将不得不继续调试以找出为什么原始线程没有LeaveCriticalSection()在它应该调用的时候调用。每个对 的调用都EnterCriticalSection()必须与对 的调用保持平衡LeaveCriticalSection(),尤其是在它们嵌套的情况下。

于 2012-05-28T16:49:14.357 回答