web-dev-qa-db-ja.com

実行中のスレッドを停止する安全な方法は何ですか?

IronPythonスクリプトの実行を含むスレッドがあります。何らかの理由で、スクリプトの実行を含め、いつでもこのスレッドを停止する必要があるかもしれません。これを達成する方法は?最初のアイデアはThread.Abort()ですが、それは悪であることが知られています...

10
aplavin

質問とその後のコメントから、2つのオプションを提案できますが、いくつかの追加の「警告」があります。

  1. スレッドが各反復で何かを実行してループする場合は、現在の反復の終了後に終了するように揮発性ブールフラグを設定できます(Pythonに精通していないため、擬似コード)。

    while shouldExit = false
        // do stuff
    

    次に、スレッドを停止するときにフラグをtrueに設定するだけで、次に条件をチェックするときに停止します。

  2. 反復が終了するのを待つことができず、すぐに停止する必要がある場合は、Thread.Abortに進むことができますが、ファイルハンドル、ソケット、ロックなどを開いたままにできないことを絶対に確認してください。一貫性のない状態です。

5
Tudor

実行中のスレッドを停止する安全な方法は何ですか?

スレッドを独自のプロセスに配置します。停止したい場合はプロセスを強制終了

これが、スレッドを強制終了する唯一のsafe方法です。スレッドを中止すると、プロセスが大幅に不安定になり、ユーザーデータが失われる可能性があります。本当に何かをしている可能性のあるスレッドを強制終了できる必要がある場合は、「ユーザーデータが失われる」シナリオを回避する方法はありません。アボートを要求しているプロセスの不安定化を回避する唯一の方法は、それらを完全に異なるプロセスにすることです

19
Eric Lippert