2012-05-28 13 views
0

不正确的行为最近我试图在Windows 7 X64的运行旧的应用程序(写在Borland的C++ Builder中6),发现IO线程不能正常工作。调试表明,问题是不会离开临界区(间接,通过一个简单的包装类)的错误处理类,所以添加每个消息日志引起的EnterCriticalSection两个电话,但只有一个LeaveCriticalSection调用。在Windows 2000中涉及的关键部分/ XP

在我看来,这个错误应该使类不可用,但它是积极地使用原开发商共同的类别之一,而这个特定的应用程序始终在Windows 2000/XP的罚款。所以问题是为什么这个错误只出现在Windows 7中?

我读过有关的关键部分MSDN文章,这里提出的问题,唯一的行为改变注意的是未定义的收购秩序,这绝对不是这样。

回答

1

我使用C++ Builder的6,我的应用程序很好地工作在Windows 7 64位的关键部分。所以你的问题必须归因于应用程序中的错误,而不是API。如果一个线程调用EnterCriticalSection(),并成功获得了锁,但不叫LeaveCriticalSection(),后面的线程死锁在自己的呼叫EnterCriticalSection()。所以你将不得不继续调试以找出原来的线程为什么不会在调用时调用LeaveCriticalSection()。每拨打EnterCriticalSection()必须调用LeaveCriticalSection(),尤其是嵌套时。

+0

不是一个真正的答案。 – 2012-05-28 16:50:43

+0

我已经找到了问题(缺少'LeaveCriticalSection()'调用)并修复它。我想知道的是为什么它可以在以前的Windows版本上运行,但它显然不应该。 –

+1

它无法工作。如果你不调用'LeaveCriticalSection()',任何其他试图获取锁的线程都会死锁。这种行为在所有版本的Windows上都是相同的。 –