2011-01-27 13 views
1

構造体へのvoid *を引数として渡すスレッドを作成します。この構造体はクラス内に作成されます。このクラスのデストラクタが呼び出されると、それがmainの最後にあり、構造体は削除されます。だから、私は、子スレッドが再び起動され、そのvoid *引数を参照すると、既に割り当てが解除されているので例外がスローされることがわかります。デストラクタが呼び出される前に子スレッドが終了することを期待していましたが、それは起こっていません。C++マルチスレッド - 子スレッドはいつ終了するのですか?

MSDNでExitthreadページから任意のデストラクタが と呼ぶことができ、または任意の他の自動クリーンアップ を行うことができる前に、

しかし、C++コードでは、スレッドは を終了します。

上記の行が参照しているデストラクタは何ですか?

子スレッドは、メインスレッドの有効期間を持つプロシージャで実行されます。グローバルフラグを使用して、私は子スレッドの実行を制御できると思った。私は、メインスレッドが実行する最後のルーチンでグローバルフラグを設定します。しかし、グローバルオブジェクトは、子スレッドが終了する前に解放されます。その場合でも、それは私を助けてくれません。

要約すると、メインスレッドの有効期間を持つ子スレッドを終了するにはどうすればよいですか?私はterminatethread apiを使いたくない。

編集:いくつかのサンプルコード方法で

//メイン

void EndofMain() 
{ 
WaitForSingleObject(globalObj->hMutex, INFINITE) 
globalObj->threadActive = false; 
ReleaseMutex(globalObj->hMutex); 
} 

void ChildThreadProc(void* data) 
{ 
while(globalObj->threadActive) 
{ 
    WaitForSingleObject(globalObj->hMutex, INFINITE) 
    //do other stuff 
    ReleaseMutex(globalObj->hMutex); 
    sleep(1000); 
} 
} 

の終わりには、今globalObjが割り当て解除された後、子スレッドが呼び出される可能性がありますか?

+3

C++にはまだマルチスレッドのサポートはありません。これはあなたがライブラリを使用していることを意味します:boost、pthreads、win32スレッド、または何らかのベンダー拡張:msvcの_beginthreadex apiなど。どちらかと言ってください。 –

+0

msvcの_beginthreadex API .. – excray

答えて

1

メインスレッドは、(ブールフラグを設定して)終了する必要のある子スレッドを通知し、main()の最後にWaitForSingleObjectを使用して、スレッドが終了するのを待ってから、デストラクタを呼び出す。これにより、デストラクタが起動する前に(安全な方法で)スレッドを強制的に終了させることで記述したエラーを防ぐことができます。

+0

私は、メインの最後にブール値フラグを設定します。しかし、WaitForSingleObjectはスレッド終了をどのように保証しますか? – excray

+0

WaitForSingleObject(threadHandle、INFINITE)は、スレッドが終了するまで(予期しないエラーが発生しない限り)戻りません。このリンクは、例と役立つ説明を提供しています:http://www.codeproject.com/KB/cpp/rendevouz.aspx –

+0

@Vivek、Templatetypedefが言いたいことは、あなたがWaitForSingleObjectに渡すハンドルが*スレッドハンドル* 。これはWaitForSingleObjectがスレッドが終了したことを保証する方法です。スレッドが終了するまで戻りません。スレッドはフラグを定期的にチェックする必要があり、フラグが設定されていれば、スレッドはできるだけ早く終了する必要があります。通常は、exitThreadを呼び出すのではなく、threadprocから返すだけで済みます。 –