155

スレッドを正しく終了する必要も、「終了」コマンドに応答させる必要もありません。純粋な C++11 を使用して強制的にスレッドを終了することに興味があります。

4

5 に答える 5

145
  1. std::terminate()任意のスレッドから呼び出すことができ、参照しているスレッドは強制的に終了します。

  2. ~thread()ターゲット スレッドのオブジェクト上で実行されるように調整することができます。そのオブジェクト上join()でも介入する必要はありません。detach()これは、オプション 1 と同じ効果があります。

  3. 例外をスローするデストラクタを持つ例外を設計できます。そして、ターゲット スレッドが強制終了されるときに、この例外をスローするように調整します。ここで注意が必要なのは、ターゲット スレッドにこの例外をスローさせることです。

オプション 1 と 2 はプロセス内リソースをリークしませんが、すべてのスレッドを終了します。

オプション 3 はおそらくリソースをリークしますが、ターゲット スレッドが例外のスローに同意する必要があるという点で部分的に協調的です。

C++ 11 (私が認識している) には、マルチスレッド プログラムで単一のスレッドを非協調的に (つまり、すべてのスレッドを強制終了せずに) 強制終了する移植可能な方法はありません。そのような機能を設計する動機はありませんでした。

Astd::threadは、次のメンバー関数を持つ場合があります。

native_handle_type native_handle();

これを使用して、OS 依存の関数を呼び出して、必要なことを実行できる場合があります。たとえば、Apple の OS では、この関数が存在しnative_handle_typepthread_t. 成功すると、リソースがリークする可能性があります。

于 2012-08-31T01:32:10.743 に答える
54

@Howard Hinnantの答えは正しく包括的です。std::terminate()ただし、@Alexander Vが念頭に置いていた「終了」(1スレッド)と(プロセス全体)がたまたま同じ名前であるため、読み取りが速すぎると誤解される可能性があります。

要約: 「1 つのスレッドを強制終了 + 強制的に (ターゲット スレッドが連携しない) + 純粋な C++11 = ありえない。」

于 2013-12-12T14:53:00.050 に答える