7

実行中のスレッドを強制終了するとどうなるか

RecordThread()つまり、複雑で時間のかかる関数を呼び出すスレッドがあります。これらの関数では、try-catchブロック、メモリの割り当てと解放、クリティカル セクション変数の使用などを使用しています。

お気に入り

  void RecordThread()
  {
    AddRecord();
    FindRecord();
    DeleteRecord();
    // ...
    ExitThread(0);
   } 

このスレッドを作成した後、スレッドが実行を完了する前に、すぐにスレッドを強制終了します。この場合、スレッドが強制終了されるとどうなりますか? スレッドを強制終了した後、内部関数 ( AddRecord、 ) は実行を完了しますか?DeleteRecord

4

4 に答える 4

15

このスレッドを作成した後、スレッドの実行が完了する前に、すぐにスレッドを強制終了します。

TerminateThread()次の方法で使用していることを意味すると思います。

HANDLE thread = CreateThread(...);

// ...
// short pause or other action?
// ...

TerminateThread(thread, 0); // Dangerous source of errors!
CloseHandle(thread);

その場合、いいえ、実行中RecordThread()のスレッドは、他のスレッドが呼び出した時点で正確に停止しますTerminateThread()。ドキュメントのメモにTerminateThread()よると、この正確なポイントは多少ランダムであり、制御できない複雑なタイミングの問題に依存します。これは、スレッド内で適切なクリーンアップを処理できないことを意味するため、スレッドを kill することはめったにすべきではありません

スレッドの終了を要求する適切な方法は、次のWaitForSingleObject()ように使用することです。

HANDLE thread = CreateThread(...);

// ...
// some other action?
// ...

// you can pass a short timeout instead and kill the thread if it hasn't
// completed when the timeout expires.
WaitForSingleObject(thread, INFINITE);
CloseHandle(thread);
于 2012-05-24T12:42:51.567 に答える
3

スレッドを強制終了することが最後の手段です。Andreがデータを不明な状態のままにしておくと述べているように、スレッドが共有オブジェクトで機能する場合は、絶対にそうしないでください。より良い選択は、次の方法で作業を終了するようにスレッドに通知することです。

-メインスレッドによってのみ変更され、ワー​​カーによってテストされるグローバル揮発性
(重要)変数を使用します-メインスレッドによって設定され、 ワー​​カーによってテストされる信号タイプの同期オブジェクト(主にイベント)を使用します

于 2012-07-18T08:54:07.850 に答える
3

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682659%28v=vs.85%29.aspx

ExitThread は、C コードでスレッドを終了するための推奨される方法です。ただし、C++ コードでは、デストラクタが呼び出される前、またはその他の自動クリーンアップが実行される前に、スレッドが終了します。したがって、C++ コードでは、スレッド関数から戻る必要があります。

ただし、関数呼び出しは ExitThread() の前に呼び出されるため、もちろん完了します。

于 2012-05-24T12:27:28.127 に答える