10

ドキュメントhereおよびhereによると、C++11 スレッドの join メソッドはstd::system_errorifをスローします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 ブロックを使用する以外に、スレッドに参加する適切な方法はありますか?

4

1 に答える 1

10

joinable does not do what you think it does. All it does is return whether the thread object is not associated with a thread. However, thread::join will fail if the thread object also represents the current thread. So the only reason for thread::join to fail due to lack of joinable is if you tried to join with yourself.

A completed thread (which isn't your own) is still perfectly joinable.

于 2013-04-14T01:27:39.460 に答える