2009-07-01 10 views
4

私は従来のコードを調べていましたが、コードでSuspendThread Functionを使用してワーカースレッドの実行を中断していることがわかりました。ワーカースレッドが要求を処理する必要があるときはいつでも、呼び出しスレッドはこのワーカースレッドを再開します。タスクが完了すると、スレッドは自身を中断します。待機中にスレッドを中断することの利点はありますか?

なぜこのようにしたのかわかりません。私によれば、WaitForSingleObject APIを持つEventオブジェクトを使用すると、もっとエレガントにできたはずです。

私の質問は、スレッドを同期オブジェクトで待機させるのと比べて、スレッドを一時停止するとどのようなメリットがありますか?どのシナリオでSuspendThread、ResumeThread APIを好むでしょうか?

+0

+1この質問を投稿しようとしていました。私は最初に検索して、人々が答えるのを待つ必要はないとうれしいです。 –

答えて

11

は私が今までに働いてきたすべての環境で推奨されていません。主な関心事は、潜在的に死んでロックを引き起こして、いくつかのリソースのロック上に保持しながら、スレッドが中断することができるということです。同期オブジェクトの観点から保存されたリソースは、デッドロックのリスクに値するものではありません。

スレッドが本質的に独自の「停止」を制御し、保持しているロックを確実に解放できるため、スレッドが待機するときはこれは問題ではありません。

SuspendThreadのドキュメントを読んだ場合、それはデバッガで使用されることがわかります。可能であれば、アプリケーションコードからそれを切り取ってください。


私のポイントを説明するために、 "使用しない" サスペンション方法のリストは、私が遭遇しました:

余談として; .NETのThread.Suspendが1.0/1.1で「サポート」されていたのは本当に驚いていました。

+0

第二に...あなたが 'suspend'を使うことで得られる利点は何でも、何らかの利点を無効にする唯一の欠点は、それが一般的に安全でなく、悪い考えであることです。スレッドごとのオブジェクトはあなたを殺すつもりはありません。 – jerryjvl

+0

スレッドはスレッド自体をサスペンドしているとの質問がありました。私はその実行において未知の点でスレッドを中断することは非常に悪い考えですが、それは質問が尋ねてきたことではないことに同意します。 –

2

特定のスレッドを起動できるようにするには、スレッドごとに個別のイベントオブジェクトが必要です。これによりカーネルオブジェクトの消費量が増加し、それだけでは不十分で、Windowsの初期バージョンで問題を引き起こす可能性があります。手動レジュームでは、新しいカーネルオブジェクトは必要ありません。スレッドの中断

関連する問題