簡単な解決策は、スレッドが定期的に 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;
}