2010-12-01 17 views
6

メッセージをスレッドから他のすべてのスレッドにバブリングして適切に終了する方法について、いくつかの情報源を読んだことがあります(すべてのスレッドは独自の出口ルーチンを実行します)。これらのうち、私はどのスレッドからもフラグを立てることができるグローバルアトミックブール値のアイデアが好きで、他のすべてのスレッドはこのフラグをチェックして出口ルーチンを実行します - すべてのスレッドが結合されると、メインスレッドはアプリケーションを終了できます。マルチスレッドアプリケーションからの効率的な終了

純粋に計算スレッドは、おそらく異なった方法で処理されるでしょうか?

これは効率的かつ安全ですか?これを行うより良い方法はありますか?

ありがとうございます!

答えて

1

Windowsでは、QueueUserAPCを使用して例外をスローする関数を呼び出し、スレッドを正常終了させます。

は、私がここにこの答えでは詳細についての詳細を書いた:

How do I guarantee fast shutdown of my win32 app?

要約すると、ここで何が起こるかです:

セイスレッドAがスレッドB(その後、C、Dを終了したいと考え、 ...)

  • スレッドAはスレッドBにハンドルを渡し、クラスMyの例外をスローする関数のアドレスを渡しますThreadExit。
  • スレッドBは、警告可能な待機をチェックするものが呼び出されるまで、通常通りに実行されます。たぶんWaitForSingleObjectEx、おそらくSleepExなどです。
  • スレッドBは先に渡されたAPC関数を実行し、例外がスレッドBにスローされるようにします。
  • スタック割り当てオブジェクトはすべて、スレッドBがスタックを巻き戻すように自動的に正しく破棄されます。
  • スレッドBの最も外側のスレッド関数は例外をキャッチします。
  • スレッドBが終了しました。スレッドAにシグナルが送信された可能性があります。
+0

はスマートに聞こえるが、私はそれを読むたびに「これはあまりにもハッキリ」と感じることができない。 – Necrolis

+0

それは移植性がないと認めるだろうが、他のほとんどのソリューションでは、あなたのスレッドで使用できるコード。私はネットワーキングのためにスレッドを頻繁に使い、安全に「停止」できるサードパーティのネットワーキングライブラリ(Indyなど)が必要です。 – Roddy

+0

私はまだそれを把握していない、より詳細な説明から。スレッド内で終了するときにQueueUserAPCを使用すると、例外をスローする関数が呼び出され、この例外はすべてのスレッドに届きます。デストラクタはどのように呼び出され、例外をスローする関数はどのように見えますか? (プログラミングのこの全領域は私には新しいものです)ありがとう! – oneminute

4

私は、時間の無駄があるため、何をするかを知るブール値(またはその他の)ステータス変数をチェックするスレッドのファンではありません。スレッドはスピンしなければならず、変数を常にチェックして新しい命令があるかどうかを確認する必要があります。これにより、CPUが焼き付けられます。

より良い選択肢は、セマフォを作成するか、Windowsでイベントを作成し、すべてのスレッドがそれを待つようにすることです。スレッドはビジー状態ではスリープすることができ、変数をチェックするだけで実際の作業を行っている他のスレッドからタイムスライスを盗むことはありません。

+0

(私は並列理論には初めてです)私のアプリケーションは排他的にWindowsです - スレッドはどのようにイベントを待っていますか?あなたが私を指すことができるどんなリソースですか? – oneminute

+0

Windowsでは、CreateEvent()によって作成されたイベントを待機するためにWaitForSingleObject()ファミリ関数を使用します。リンク:http://msdn.microsoft.com/en-us/library/ms682396(VS.85).aspx –

+0

私はちょっと混乱しています。だから、各スレッドでWaitForSingleObject(exitHandle、0)の戻り値を確認します。出口イベントが通知されているかどうかを確認します。 – oneminute

関連する問題