1. ホーム
  2. c++

[解決済み] std::thread - 「アクティブな例外なしに呼び出された終了」、それに「参加」したくない。

2022-02-01 23:06:48

質問

の通りです。 この質問 私は、ユーザー入力で関数を終了させるためにスレッドを使用しています。 私のコードは次のようなものです。

bool stopper = false;
thread stopThread(userStop, &stopper);      // start thread looking for user input
for(int i = 0; i < 1000; i++) {
    if(stopper) { break; }                  // break if desired
    // Do stuff
}
return 0;

のところです。

userStop(bool *st) {
    char chChar = getchar();
    if(chChar == '\n') {
        *st = true;
    }
}

これを実行すると、エラーが発生します。 terminate called without an active exception . これらの質問をもとに アクティブな例外がない状態で呼び出されたスレッドの終了 , アクティブな例外を発生させずに C++ を終了させる またスレッドに参加していないので、そのように見えます。

問題は、スレッドに「参加」したくないということです -- なぜなら、そうするとユーザーが 必要 に入力する。 userStop() を終了させたいのですが、forループを解除する場合のみ、ユーザーに入力させたいのです(必ずしも解除されるわけではありませんが)。

ありがとうございます。

解決方法は?

発生しているトラブルは stopThread がスタック上のスコープ外に出てしまった。これについては、C++の規格に次のように書かれています。

30.3.1.3 スレッドデストラクタ[thread.thread.destr]

~thread()です。

もし joinable() であれば、terminate() を実行し、そうでなければ、何もしません。[ 注意 どちらか を暗黙のうちにデタッチまたはジョインしています。 joinable() スレッドのデストラクタで デバッグが困難な正しさ(デタッチの場合)または 例外が発生したときにのみ発生するパフォーマンスバグ(結合の場合) が発生します。したがって、プログラマは、デストラクタが決して スレッドがまだ参加可能な状態で実行されます。- エンディングノート ]

この意味は、スレッドをスコープ外に出すには、最初に join() または detach() .

あなたの説明では、アプリケーションの実行中にスレッドが実行され続けるように、参加せずにスコープの外に出るようにしたいのでしょう。そのためには detach() . そこから先は、ちょっとした知恵を出すしかないのですが......。

  • そのスレッドは今、自分自身の寿命について完全に責任を負っています。もしそれが自分自身で戻らなければ、永遠に(プロセスが終了するまで)実行されるでしょう。

  • ユーザーからの入力は、おそらく次のようなものから得ています。 cin または getch() . これらが複数のスレッドからアクセスされる場合、それらのライブラリ実装にレースコンディションが存在しないことはあまり保証されません。 軽く踏んでください。