boost thread::join() in a destructor is warned by a static analysis tool

161 views Asked by At

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?

1

There are 1 answers

1
Quarra On

I'd add try/catch in StopThreads, won't it help? BTW, shouldn't you use if(t.joinable()) t.join(); or sth like that?