1. ホーム
  2. c++

[解決済み] C++11でスレッドを終了させるにはどうしたらいいですか?

2022-04-27 09:41:52

質問

スレッドを正しく終了させたり、"terminate"コマンドに応答させる必要はないのですが、どうしたらいいですか?純粋なC++11を使用して、スレッドを強制的に終了させることに興味があります。

どのように解決するのですか?

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

  2. を手配することができます。 ~thread() を挟むことなく、ターゲットスレッドのオブジェクト上で実行されます。 join() また detach() をそのオブジェクトに追加します。 これはオプション1と同じ効果になります。

  3. 例外をスローするデストラクタを持つ例外を設計することができます。 そして、ターゲットスレッドが強制終了されるときに、この例外を投げるように手配する。 この場合、ターゲットスレッドがこの例外を投げるようにするのが厄介な点です。

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

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

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

A std::thread は、このメンバ関数を持つことができます。

native_handle_type native_handle();

これを利用して、OSに依存した関数を呼び出して、やりたいことができるかもしれません。 例えばAppleのOSでは、この関数が存在し native_handle_typepthread_t . 成功すると、リソースが流出する可能性が高いです。