0

次のコードでクラッシュが発生しています。このメソッドは、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.
........
........

}

私の質問は -

  1. 最初のコードに何か問題がありますか。ブーストのドキュメントによると、問題ないようです。

  2. 有効なハンドルが渡されたときではなく、古いハンドルが渡された場合、WaitForSinfleObject() はクラッシュするはずです。何かご意見は ?

  3. バグを修正するための私のアプローチは正しいですか?

注 - この問題をデバッグできませんでした。これは、制御がデバッガーの WaitForSingleObject に到達するまでに、デバッガーで T1 が既に実行を完了しているため、クラッシュが発生していないためです。

4

0 に答える 0