ドキュメントhereおよびhereによると、C++11 スレッドの join メソッドはstd::system_error
ifをスローしますjoinable() == false
。したがって、スレッドが実行を完了するのを待つ自然な方法は、次のようなものです。
if (thread2.joinable()) thread2.join();
ただし、これは std::system_error をスローする可能性があります。スレッド 1 が thread2.joinable() を呼び出し、true を返し、スレッド 2 がまだ実行中であることを示しているとします。次に、スケジューラはスレッド 1 を一時停止し、コンテキストをスレッド 2 に切り替えます。スレッド 2 が完了すると、スレッド 1 が再開します。スレッド 1 は thread2.join() を呼び出しますが、thread2 は既に完了しているため、std::system_error がスローされます。
考えられる解決策は、すべてを try ブロックでラップすることです。
try {
thread2.join();
catch (std::system_error &e) {}
しかし、正当な std::system_error がスローされた場合、おそらくスレッドが参加に失敗したことを示している可能性がありますが、プログラムは続行し、すべてが順調であるかのように動作します。このような try/catch ブロックを使用する以外に、スレッドに参加する適切な方法はありますか?