構造体への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が割り当て解除された後、子スレッドが呼び出される可能性がありますか?
C++にはまだマルチスレッドのサポートはありません。これはあなたがライブラリを使用していることを意味します:boost、pthreads、win32スレッド、または何らかのベンダー拡張:msvcの_beginthreadex apiなど。どちらかと言ってください。 –
msvcの_beginthreadex API .. – excray