如何可靠地判断boost线程是否已退出其run方法?

时间:2009-11-03 13:45:59

标签: c++ boost multithreading

我认为可加入会表明这一点,但是,似乎并非如此。

在一个工人类中,我试图表明它仍在通过谓词进行处理:

bool isRunning(){return thread_->joinable();}

退出的线程不能加入吗?我错过了什么...... boost thread :: joinable是什么意思?

7 个答案:

答案 0 :(得分:31)

由于即使在线程终止后你也可以加入一个线程,所以在你调用join()或detach()之前,joinable()仍会返回true。如果你想知道一个线程是否仍然在运行,你应该能够在等待时间为0的情况下调用timed_join。注意这可能会导致竞争条件,因为线程可能在调用之后立即终止。

答案 1 :(得分:6)

使用最小超时的thread::timed_join()。如果线程仍在运行,它将返回false。

示例代码:

thread_->timed_join(boost::posix_time::seconds(0));

答案 2 :(得分:3)

你从根本上做不到这一点。原因是两个可能的答案是“是”和“不是我最后一次看,但也许现在”。没有可靠的方法来确定线程仍在其run方法中,即使有可靠的方法来确定相反的方法。

答案 3 :(得分:3)

我正在使用boost 1.54,不推荐使用timed_join()。根据您的使用情况,您可以使用joinable(),它可以完美地用于我的目的,或者您可以使用try_join_for()或try_join_until(),请参阅:

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

答案 4 :(得分:0)

这有点粗糙,但截至目前,它仍然符合我的要求。 :)我使用的是boost 153和qt。我创建了一个int矢量来跟踪"状态"我的主题。每次我创建一个新线程时,我都会向thread_ids添加一个值为0的条目。对于每个创建的线程,我传递一个ID,这样我就知道我应该更新哪个thread_ids部分。根据我当前正在进行的活动将运行状态和其他值设置为1,因此我知道线程结束时正在执行的活动。 100是我为正确完成的线程设置的值。我不确定这是否会有所帮助,但如果您有关于如何改进的其他建议请告诉我。 :)

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();
}

答案 5 :(得分:0)

最简单的方法是,如果运行线程的函数足够简单,那么在函数完成时将变量设置为true。当然,如果你有很多线程ID的地图,你需要一个每个线程的变量,状态可以是更好的选择。我知道它是手工制作的,但同时也能正常工作。

class ThreadCreator
{
private:
    bool            m_threadFinished;
    void launchProducerThread(){
        // do stuff here
        m_threadRunning = true;
    }
public:
    ThreadCreator() : m_threadFinished(false) {
        boost::thread(&Consumer::launchProducerThread, this);
    }
};

答案 6 :(得分:0)

这可能不是你问题的直接答案,但我认为线程概念是一种非常轻量级的机制,除了同步机制外,故意没有任何东西。我认为放置“正在运行”的正确位置是在定义线程函数的类中。请注意,从设计角度来看,您可以在中断时退出线程,但仍然无法完成工作。如果要在线程完成后清理线程,可以将其包装在安全指针中并将其交给工人类。