私たちのアプリケーションには、ネットワーク上のものを含め、ファイルシステムの変更をリスンするサブシステムがあります。場合によっては、おそらくネットワークがストレス下にあるときに、リスニングスレッドが邪魔になることがあります。ここでの議論は、誤ったスレッド同期によって引き起こされるデッドロックではないことを強調します。スレッドは、CreateFile
への最初の呼び出し、またはその後のファイルシステムAPIの呼び出しのいずれかでスタックになってしまいます。問題は、そのようなスレッドで何をするかです。デッドスレッドとは何か(デッドロックではない)?
特定のスレッドが一定期間無効であると判断して終了することができます。しかし、権威のある人々は、それは非常に悪いと言いますが、私は死んだスレッドを維持する理由が理解できないのですが、それを終了するよりも優れています。それから私は、スレッドで割り当てられたいくつかのリソース、例えばファイルハンドルをリリースできると思った。
私は、ファイルハンドルを閉じ、デッドスレッドによって割り当てられたメモリを解放するスレッドクリーナーを作成しました。しかし、すぐに私は、クリーナーのスレッドがCloseHandle
APIへの呼び出しでそれ自身に固執してしまったことに気づいた。 CloseHandle
が立ち往生できないと確信していたので、私は本当にショックを受けました。
アプリケーションが長時間動作し、ネットワークまたはその一部に問題が残っていると、多くのシステムリソースを持つ多数のデッドスレッドが発生する可能性があります。 !
を参照してください。スレッドが強制的に停止するのは悪いですが、どのような状態になっているのか、どのスレッドがロックされているのか、どのファイルが開いているのかなどは分かりませんが、スレッドを_stop_することは提案していません。あなたが制御できない理由のため、すでに停止しているスレッドをどのように破壊するかを尋ねています。 –
@jamesしかし、私は実際に停止したスレッドがどの状態にあるのか分からない! I/O要求を実行すると、内部的に私が気づいていないクリティカルセクションに入る可能性があります。 'CloseHandle'が同じクリティカルセクションにアクセスすると、これはなぜ私の"クリーナー "スレッドも停止したことを説明することができます。あなたが言及したすべての注意は私の場合にも当てはまります。 – Ilia
スレッドが停止すべきではないときにスレッドが停止し、なぜBad Thingであるのかわからないという事実。それについては疑いがない。私はあなたがおそらく停止したスレッドを破壊することによって状況を悪化させないと言っているだけです。 –