0

最近、古いアプリ (Borland C++ Builder 6 で作成) を Windows 7 x64 で実行しようとしたところ、IO スレッドが機能していないことがわかりました。デバッグは、問題がエラー処理クラスにあり、クリティカル セクションを離れていないことを示した (単純なラッパー クラスを介して間接的に) ため、ログに追加されたすべてのメッセージが の 2 回の呼び出しを引き起こしましたが、 のEnterCriticalSection呼び出しは 1 回だけでしLeaveCriticalSectionた。

このエラーによってクラスが使用できなくなるように思われますが、これは元の開発者が積極的に使用している一般的なクラスの 1 つであり、この特定のアプリケーションは 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 に答える