次のコードでクラッシュが発生しています。このメソッドは、boost::thread() api を使用して作成されたスレッドが完了するのを待っています。以下のブーストのドキュメントによると、コードは正しいようですが、一貫して次の動作を観察します
呼び出しが WaitforSingleObject に到達するまでにスレッド T1 がすでに完了している場合は、waitforSingleObject に古いハンドルが渡されたことを意味し、何も起こらず、0 が返されます
。有効なハンドルが waitforSingleObject に渡されますが、すぐにクラッシュします。
問題のあるコード -
void waitForJoin( volatile int &exit_now, boost::thread &T1 ) {
.........
.........
WaitForSingleObject( T1.native_handle(), INFINITE ); // Crashes here.
........
........
}
WaitForSingleObject() を join() メソッドに置き換えると、問題なく動作します。
void waitForJoin( volatile int &exit_now, boost::thread &T1 ) {
.........
.........
T1.join() // Works.
........
........
}
私の質問は -
最初のコードに何か問題がありますか。ブーストのドキュメントによると、問題ないようです。
有効なハンドルが渡されたときではなく、古いハンドルが渡された場合、WaitForSinfleObject() はクラッシュするはずです。何かご意見は ?
バグを修正するための私のアプローチは正しいですか?
注 - この問題をデバッグできませんでした。これは、制御がデバッガーの WaitForSingleObject に到達するまでに、デバッガーで T1 が既に実行を完了しているため、クラッシュが発生していないためです。