2012-02-25 13 views
3

私はスレッドライブラリを設計しています。これまでは、ライブラリを初期化するメソッドを持っていました。スレッドを作成するメソッドと、実行可能なスレッドのキューにある現在のスレッドを次のスレッドに戻すメソッドがあります。スレッドを強制終了する方法を知るには?

スレッドのセマフォーの実装に移る前に、スレッドが完了するとすぐにスレッドを強制終了し、割り振られたメモリーを解放する必要があると考えましたが、その方法を理解するのに問題があります。スレッドが「終了」したときはどうすればわかりますか?

+4

スレッドプロシージャから戻るとき、またはPOSIXの 'pthread_exit'に相当するライブラリ関数を呼び出すときはどうでしょうか?また、なぜあなたは車輪を再発明していますか? –

+2

これは、オペレーティングシステムによって大きく異なります。しかし、強制的にスレッドを強制終了するのが最後の手段です。一般的には、スレッドを自然に返すだけです。 –

答えて

4

スレッドを安全に、または確実に強制終了しないでください。スレッドが自然に終了するようにしてください(エントリが戻るとき)。

システムはスレッドを強制終了する手段を提供しますが、ほとんどのC++プログラムは、未定義の動作が続くと予想されます。 の殺しがの場合、副作用なしに(プログラムの残りの部分に)達成できるケースを夢見ることができますが、そのプログラムはまったく慣用的なC++に似ていません。そのようなプログラムは非常にエキゾチックで、多くの普通で厳しい制限があります。

スレッドが終了したかどうかを知りたいときは、ステータスを追跡するために終了する前にクリーンアップを追加することができます。

スレッド出口を自然に要求する機能を使用するには、ループとメッセージを実行することを検討してください。

0

フォークされたプロシージャの実行が終了したときに明示的にスレッドを終了させることはありません。そのコードは、やはり終了するスレッドのコンテキスト内にあります。

スレッドのコンテキスト切り替えを処理し、これを管理するためのいくつかのキューを保持するスケジューラ/割り込みハンドラがあります。おそらくfinish()のメソッド(またはそれに類するもの)の中のscheduler->SetThreadToKill(currentThread);のような、殺すスレッドへの参照を保存することができます。これは対応するスレッドのフラグを設定します。

コンテキスト切り替えが発生し、現在のスレッドのすべてのデータ構造を次のスレッドのものにスワップアウトした場合、スケジューラはtoBeKilledフラグが設定されているすべてのスレッドのデストラクタを呼び出すことができます。

0

スレッドを強制終了するための最良の方針は、明示的に行うことではありません(あなたがOSでない限り、つまりアプリケーションのシャットダウン時)。より多くの作業を実行するためにキューの周りをループするスレッドへのメッセージとタスクをキューに入れます。新しいスレッドを作成、開始、終了、削除、テスト、チェック、登録、デリスト、エンキュー、デキュー、またはその他の方法でマイクロ管理するコードを書く必要がなければ、そのコードはバグを含むことができません。

関連する問題