Joining threads in a destructor works well for me, but it is warned by a static analysis (Coverity).
Here is my threadpool code.
class CMyThread {
// other definitions
std::vector<boost::thread> threadWorker;
~CMyThread(){
StopThreads();
}
void StopThreads(){
for (auto& t : threadWorker) {
t.join();
}
}
};
Actually it works well, but SPA tool warns a possible exception from the function 'join()' because it may throw a 'thread_resource_error' and it is not acceptable for the destructor. The exception appears in the following boost code.
void thread::join() {
if (this_thread::get_id() == get_id())
boost::throw_exception(thread_resource_error(static_cast<int>(system::errc::resource_deadlock_would_occur), "boost thread: trying joining itself"));
BOOST_THREAD_VERIFY_PRECONDITION( join_noexcept(),
thread_resource_error(static_cast<int>(system::errc::invalid_argument), "boost thread: thread not joinable")
);
}
}
How could I guarantee that there is no 'joining itself' condition? or should I ignore the warning?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…