オブジェクトが破棄される前にスレッドが完了していることを確認したい。
これが私が考えることができる最も基本的な例です:
struct User {
std::thread worker_thread;
~User() {
if (worker_thread.joinable()) {
worker_thread.join();
}
}
};
これは問題に対する正しいアプローチですか?
オブジェクトが破棄される前にスレッドが完了していることを確認したい。
これが私が考えることができる最も基本的な例です:
struct User {
std::thread worker_thread;
~User() {
if (worker_thread.joinable()) {
worker_thread.join();
}
}
};
これは問題に対する正しいアプローチですか?
join()
例外をスローする可能性があり、例外がデストラクタをエスケープさせたくないため、正しくありません。Herb Sutters Exceptional C++の「スローされるデストラクタとなぜ悪であるか」セクションから。:
標準的な例外の安全規則を守ってください: 例外がデストラクタまたはオーバーロードされた演算子からエスケープすることを許可しないか、すべてのデストラクタと割り当て解除関数を " ."の例外指定がある
delete()
かのように記述してはいけません。operator delete[]();
throw()
また、コメントに記載されているように問題ないと思いますが、必要に応じてスレッドを適切に終了する必要があります。
たとえば、ゆっくりとカウントダウンするループ カウンターがある場合は、長い待機キューの前に適切に閉じる必要があります。たとえば、トグルする必要がある「無限の」ブール条件がある場合などは、なおさらです。