スレッドを正しく終了させる必要はなく、「終了」コマンドに応答させることもできます。私は、純粋なC++ 11を使ってスレッドを強制終了することに興味があります。C++ 11でスレッドを終了するにはどうすればよいですか?
答えて
std::terminate()
は任意のスレッドから呼び出すことができ、参照しているスレッドは強制的に終了します。あなたは、そのオブジェクト上の介在join()
もdetach()
せずに、ターゲット・スレッドのオブジェクト上で実行される~thread()
の手配ができ。これは、オプション1と同じ効果を持ちます。
例外をスローするデストラクタを持つ例外を設計できます。そして、ターゲットスレッドが強制終了されるときにこの例外をスローするように調整します。この問題のトリッキーな部分は、この例外をスローするターゲットスレッドを取得しています。
オプション1と2は、プロセス内のリソースをリークしていないが、彼らはすべてのスレッド終了します。
オプション3はおそらくリソースをリークしますが、ターゲットスレッドが例外をスローするのに同意する必要があるという点で部分的に協調的です。
マルチスレッドプログラムで単一のスレッドを非協力的に(つまりすべてのスレッドを強制終了せずに)強制終了するC++ 11では移植性の高い方法はありません。このような機能を設計する動機はありませんでした。
std::thread
は、このメンバ関数を持っていることがあります。
native_handle_type native_handle();
あなたがやりたいOS依存の関数を呼び出すためにこれを使用することができるかもしれません。たとえばAppleのOSの場合、この関数は存在し、native_handle_type
はpthread_t
です。成功すれば、リソースが漏れる可能性があります。
-1 'std :: terminate'はすべてのスレッドを殺し、プログラムを終了します... –
@ChrisDodd Counter +1、それは彼が彼の答えに書いたものです。 – inf
_ "プロセス内のリソースをリークしない" _少しの間、OSはプロセスを強制終了した後にすべてのリソースを再利用することは当然のことですが、プログラムに関してはリソースが漏れています。それは通常は無関係ですが、場合によっては依然として問題となる可能性があります。 'std :: terminate'は静的デストラクタを呼び出すことも、出力バッファをフラッシュすることもしないので、リソースが解放される順序は明確ではなく、またあなたのデータがユーザに見えるようにしたり、永続的な店舗へ、または一貫して完全なものにすることができます – Damon
@ Howard Hinnantの答えは両方とも正しいです。とです。 std::terminate()
(プロセス全体)は、@AlexanderVXが念頭に置いていた「終了」(1スレッド)と同じ名前を持っているので、読み込みが速すぎると誤解される可能性があります。
要約:「1スレッド+強制終了(ターゲットスレッドは協調しない)+純粋なC++ 11 =いいえ」。
ああ、私の#1は本当に面白いです。強制終了するスレッドを指定する必要はありません。このシステムは、あなたが強制的に終了させたいものを魔法のように知っています。 –
はい、 'std :: terminate()'の答えは古典的ないたずらなDjinnの話に似ています。おそらく彼が*意味する方法ではないが、それは手紙へのOPの希望のすべてを満たす。 控えめなユーモアが私を笑わせてくれました。 :-) –
無邪気なC++の初心者の希望があまりにも遠く/長すぎるのを防ぐ必要があります。 –
この質問は、実際にはより深い性質を持ち、マルチスレッドの概念をよく理解しているため、このトピックについての洞察が得られます。実際には、非同期で突然スレッドを終了させる機能を提供する言語やオペレーティングシステムはありません。これらの実行環境はすべて、開発者に強くアドバイスします。協調スレッドまたは同期スレッド終了の基盤にマルチスレッドアプリケーションを構築する必要があります。この共通の意思決定とアドバイスの理由は、すべてが同じ一般的なマルチスレッドモデルの基盤上に構築されているためです。
マルチプロセッシングとマルチスレッドの概念を比較して、第2の利点と制限をよりよく理解してみましょう。
マルチプロセッシングは、実行環境全体を、オペレーティングシステムによって制御される完全に分離されたプロセスのセットに分割することを前提としています。プロセスは、プロセスとその内部のデータとファイル、ソケット、同期オブジェクトなどのすべてのシステムリソースのローカルメモリを含む実行環境の状態を組み込み、分離します。分離は、プロセスの境界線による障害の伝搬を制限するため、プロセスの非常に重要な特性です。言い換えると、システム内の他のプロセスの一貫性に影響を与えるプロセスはありません。プロセスの振る舞いは同じですが、制限が少なくてぼやけています。このような環境では、プロセスが使用されているすべてのリソースについて完全な知識を持っており、漏れなくすべてを解放することができ、最後にプロセスが強制終了されるため、プロセスはいずれかの「任意の」瞬間に殺される可能性があります。 OSは実際には恣意的な瞬間ではなく、プロセスの状態がよく分かっている明確に定義されたポイントの数になります。
一方、マルチスレッドでは、同じプロセスで複数のスレッドを実行していることが前提です。しかし、これらのスレッドはすべて同じアイソレーションボックスを共有しており、プロセスの内部状態をオペレーティングシステムで制御することはできません。その結果、どのスレッドもグローバルなプロセス状態を変更することができます。同時に、スレッドの状態がスレッドを完全に殺すのに安全であることがよく知られている点は、アプリケーションロジックに依存し、オペレーティングシステムおよびプログラミング言語ランタイムのどちらにも知られていません。その結果、任意の瞬間のスレッド終了は、その実行パスの任意のポイントでそれを終了させることを意味し、プロセス全体のデータ破損、メモリおよびハンドルリーク、スレッドリークおよびスピンロックおよび他のプロセス内同期プリミティブ進行中の他のスレッドを阻止します。
一般的なアプローチは、同期または協調スレッドの終了を実装するように強制することです。一方のスレッドは他のスレッドの終了を要求でき、明確に定義されたポイントの他のスレッドはこの要求をチェックし、すべてのグローバルなシステム全体のリソースとローカルのプロセス全体のリソースを安全かつ一貫した方法で解放して、明確な状態にします。 C++スレッドを終了するために、OS依存の機能を使用しての
これはあまり役に立ちません。ここではマルチプロセッシングは関係ありません。マルチスレッドに関する観察はかなり幅広いものです。 – MSalters
私が言いたいことは、マルチスレッドモデルでは強制的なスレッド終了の正式な方法が提供されないということです。 C++は、メモリモデル、マルチスレッドモデルなどの明確なモデルに従いたいと考えています。強力なスレッド終了の方法は、本質的に安全ではありません。 C++標準委員会がC++にそれを追加することを強制された場合、次のステートメント "メソッド終了(スレッド実行を終了させる)が行われます。"は、 "いくつかの魔法を作って(おそらく)スレッドを終了させる" – ZarathustrA
ヒント:
std::thread::native_handle()
のみjoin()
またはdetach()
を呼び出す前に、スレッドの有効なネイティブハンドル・タイプを取得することができます。その後、native_handle()
は0 -pthread_cancel()
を返します。が効果的にネイティブスレッド終了関数を呼び出すには(例えば
pthread_cancel)
、あなたはstd::thread::join()
やstd::thread::detach()
を呼び出す前に、ネイティブハンドルを保存する必要があります。あなたのネイティブターミネータは常に有効なネイティブハンドルを使用するようにしているように。
詳細については、http://bo-yang.github.io/2017/11/19/cpp-kill-detached-threadを参照してください。
- 1. アプリケーション終了時にDelphiで匿名スレッドを終了するにはどうすればよいですか?
- 2. C++でコールバック関数からスレッドを終了する11
- 3. Windowsでスレッドが終了する理由を検出するにはどうすればよいですか?
- 4. C#でスレッドを終了するには?
- 5. ThreadId経由でスレッドの終了を検出するにはどうすればよいですか?
- 6. スレッドが終了した後でQt関数を実行するにはどうすればよいですか?
- 7. 状態がRUNNINGのJavaでスレッドを強制終了するにはどうすればよいですか?
- 8. ビュースコープ付きBeanでスレッドを終了するにはどうすればよいですか?
- 9. スレッドを正しく終了するにはどうすればよいですか? Qtで?
- 10. ExecutorServiceでタイムアウトしたスレッドのみを終了するにはどうすればよいですか?
- 11. UWPアプリケーションをプログラムで終了または終了するにはどうすればよいですか? (Windows 10)
- 12. vimperatorでビューソースモードを終了するにはどうすればよいですか?
- 13. Androidでタスクを終了するにはどうすればよいですか?
- 14. jquery.jmslideshow.js終了するにはどうすれば終了するのですか
- 15. スレッドがC++ 11以上で作業を終了したかどうかをチェックする方法は?
- 16. 「すべて終了」後にnode.jsスクリプトを終了するにはどうすればよいですか
- 17. IRBセッションを終了せずにデバッガを終了するにはどうすればよいですか?
- 18. Python:タイムアウト後にスレッドを強制終了させるにはどうすればよいですか?
- 19. モバイルアプリを強制終了するにはどうすればよいですか?
- 20. 終了タグを表示するにはどうすればよいですか?
- 21. ループを終了するにはどうすればよいですか?
- 22. ループを終了するにはどうすればよいですか?
- 23. フルスクリーンiframeを終了するにはどうすればよいですか?
- 24. アンドロイドアプリを終了するにはどうすればよいですか?
- 25. ブレークを使用せずにC++でループを終了するにはどうすればよいですか?
- 26. 終了確認を避けるにはどうすればよいですか?
- 27. 強制終了アプリなしでAndroidでデーモンスレッドを終了するにはどうすればいいですか?
- 28. bool sentinel値を使ってC++でwhileループを終了するにはどうすればよいですか?
- 29. pthreadでスリープスレッドを終了するにはどうすればいいですか?
- 30. プロンプトでプログラムを終了するにはどうすればいいですか?
このトピックに関するご質問は、次のとおりです。http://stackoverflow.com/questions/2790346/c0x-thread-interruption "すべての言語仕様では、サポートは構築されていませんラングに年齢は –