98

aがまだ実行されているかどうかを確認するにはどうすればよいstd::threadですか (プラットフォームに依存しない方法で)? メソッドがなく、そのためのものtimed_join()joinable()はありません。

std::lock_guardスレッド内で a を使用してミューテックスをロックし、ミューテックスのtry_lock()メソッドを使用して、まだロックされている (スレッドが実行されている) かどうかを判断することを考えましたが、不必要に複雑に思えます。

もっとエレガントな方法を知っていますか?

更新:明確にするために:スレッドが正常に終了したかどうかを確認したい。「ハングしている」スレッドは、この目的のために実行されていると見なされます。

4

7 に答える 7

5

簡単な解決策は、スレッドが定期的に true に設定するブール変数を持つことです。これは、ステータスを知りたいスレッドによってチェックされ、false に設定されます。変数が長い間 false の場合、スレッドはアクティブであると見なされなくなります。

よりスレッドセーフな方法は、子スレッドによって増加されるカウンターを持つことです。メインスレッドはカウンターを保存された値と比較し、長時間同じ場合、子スレッドはアクティブでないと見なされます。

ただし、C++11 では、ハングしたスレッドを実際に強制終了または削除する方法がないことに注意してください。

編集スレッドが正常に終了したかどうかを確認する方法: 基本的には最初の段落で説明したのと同じ手法です。ブール変数を false に初期化します。子スレッドが最後に行うことは、それを true に設定することです。その後、メイン スレッドはその変数をチェックし、真の場合は (もしあれば) あまりブロックせずに子スレッドで結合を行います。

Edit2例外が原因でスレッドが終了する場合は、2 つのスレッド「メイン」関数を用意します。最初の関数にはtry-catchがあり、その中で 2 番目の「実際の」メイン スレッド関数を呼び出します。この最初のメイン関数は、「have_exited」変数を設定します。このようなもの:

bool thread_done = false;

void *thread_function(void *arg)
{
    void *res = nullptr;

    try
    {
        res = real_thread_function(arg);
    }
    catch (...)
    {
    }

    thread_done = true;

    return res;
}
于 2012-02-01T10:47:51.803 に答える
4

join メソッドでブロックせずにスレッドの終了を検出するために使用できるこの単純なメカニズム。

std::thread thread([&thread]() {
    sleep(3);
    thread.detach();
});

while(thread.joinable())
    sleep(1);
于 2016-03-25T17:11:29.853 に答える
1

実行中のスレッドと呼び出し元のスレッドの両方がアクセスできるミューテックスを作成します。実行中のスレッドが開始するとミューテックスがロックされ、終了するとミューテックスがロック解除されます。スレッドがまだ実行されているかどうかを確認するために、呼び出し元のスレッドは、mutex.try_lock() を呼び出します。その戻り値はスレッドのステータスです。(try_lock が機能した場合は、必ずミューテックスのロックを解除してください)

これに関する小さな問題として、スレッドが作成されてからミューテックスがロックされるまでの間、mutex.try_lock() が false を返しますが、これはもう少し複雑な方法を使用して回避できます。

于 2013-06-19T11:21:11.660 に答える
0

確かにfalse、スレッドがtrue終了する前に行う最後のこととして に初期化された、ミューテックスでラップされた変数を持っています。それはあなたのニーズに十分なアトミックですか?

于 2012-02-01T11:19:22.960 に答える