0

私は CreateThread を使用してから TerminateThread を使用してスレッドをキャンセルしています。スタック領域がまだ割り当てられているようです。これに対処する方法はありますか?malloc/new などの動的メモリ呼び出しは使用していません。スレッドは正常に終了する必要はありません。10 スレッドで、なんと 5 MB のメモリが残ります! スレッドはすべてコードのさまざまな部分にあるため、スレッド間通信システムを実装して、すべて正常に終了し、スタックの方向を変更するように指示できる簡単な方法はありますか?

4

2 に答える 2

11

ほとんどの場合、使用しないTerminateThread()でください。アプリケーションで新しいスレッドを作成する場合、それらのスレッドが正常に終了することを確認するのはユーザーの責任です。を使用するTerminateThread()と、この関数はクリーンアップ関数を呼び出さずにスレッドを終了するだけなので、あらゆる種類のリソースが取り残される可能性があります。

TerminateThread ドキュメント

すべきことは、イベント (または他のシグナル伝達方法) を使用して、スレッドがシャットダウンすることになっていることをスレッドに伝えることです。スレッドが内部的にメッセージを受信すると (イベントが通知されるか、待機が期限切れになるなど)、スレッド関数は内部的にクリーンアップして戻ることができます。このようにして、スレッドを正しく終了し、混乱を残さないようにします。

于 2012-09-03T05:12:01.113 に答える
3

非自動リセット イベントとプライマリ スレッドの WaitForMultipleObjects は、必要なことを行います。同時実行ワーカー スレッドが 64 を超えていることに気付いた場合は、再設定して、非自動リセット イベントやセマフォなどの別のアプローチを使用する必要があります。この問題にアプローチする方法は文字通り数十あり、インターネット全体のフォーラムには数え切れないほどの例があり、MS の Visual Studio の配布の例もあります。それらから始めます。

于 2012-09-03T05:17:47.270 に答える