How can I tell reliably if a boost thread has exited its run method?

后端 未结 7 983
情歌与酒
情歌与酒 2020-12-01 13:40

I assumed joinable would indicate this, however, it does not seem to be the case.

In a worker class, I was trying to indicate that it was still processing through a

相关标签:
7条回答
  • 2020-12-01 14:28

    I am using boost 1.54, by which stage timed_join() is being deprecated. Depending upon your usage, you could use joinable() which works perfectly for my purposes, or alternatively you could use try_join_for() or try_join_until(), see:

    http://www.boost.org/doc/libs/1_54_0/doc/html/thread/thread_management.html

    0 讨论(0)
  • 2020-12-01 14:29

    The easiest way, if the function that is running your thread is simple enough, is to set a variable to true when the function is finished. Of course, you will need a variable per thread, if you have many a map of thread ids and status can be a better option. I know it is hand made, but it works fine in the meanwhile.

    class ThreadCreator
    {
    private:
        bool            m_threadFinished;
        void launchProducerThread(){
            // do stuff here
            m_threadRunning = true;
        }
    public:
        ThreadCreator() : m_threadFinished(false) {
            boost::thread(&Consumer::launchProducerThread, this);
        }
    };
    
    0 讨论(0)
  • 2020-12-01 14:34

    You fundamentally can't do this. The reason is that the two possible answers are "Yes" and "Not when I last looked but perhaps now". There is no reliable way to determine that a thread is still inside its run method, even if there was a reliable way to determine the opposite.

    0 讨论(0)
  • 2020-12-01 14:34

    This is a bit crude but as of now it's still working for my requirements. :) I'm using boost 153 and qt. I created a vector of int for tracking the "status" of my threads. Every time I create a new thread, I add one entry to thread_ids with a value of 0. For each thread created, I pass an ID so I know what part of thread_ids I'm supposed to update. Set the status to 1 for running and other values depending on what activity I am currently doing so I know what activity was being done when the thread ended. 100 is the value I set for a properly finished thread. I'm not sure if this will help but if you have other suggestions on how to improve on this let me know. :)

    std::vector<int> thread_ids;
    const int max_threads = 4;
    void Thread01(int n, int n2)
    {
        thread_ids.at(n) = 1;
        boost::this_thread::sleep(boost::posix_time::milliseconds(n2 * 1000));
        thread_ids.at(n) = 100;
        qDebug()<<"Done "<<n;
    
    }
    void getThreadsStatus()
    {
        qDebug()<<"status:";
        for(int i = 0; i < max_threads, i < thread_ids.size(); i++)
        {
            qDebug()<<thread_ids.at(i);
        }
    }
    int main(int argc, char *argv[])
    {
        for(int i = 0; i < max_threads; i++)
        {
            thread_ids.push_back(0);
            threadpool.create_thread(
                boost::bind(&boost::asio::io_service::run, &ioService));
            ioService.post(boost::bind(Thread01, i, i + 2));
            getThreadsStatus();
        }
    
        ioService.stop();
        threadpool.join_all();
        getThreadsStatus();
    }
    
    0 讨论(0)
  • 2020-12-01 14:36

    Use thread::timed_join() with a minimal timeout. It will return false if the thread is still running.

    Sample code:

    thread_->timed_join(boost::posix_time::seconds(0));
    
    0 讨论(0)
  • 2020-12-01 14:40

    Since you can join a thread even after it has terminated, joinable() will still return true until you call join() or detach(). If you want to know if a thread is still running, you should be able to call timed_join with a wait time of 0. Note that this can result in a race condition since the thread may terminate right after the call.

    0 讨论(0)
提交回复
热议问题