我认为可加入会表明这一点,但是,似乎并非如此。
在一个工人类中,我试图表明它仍在通过谓词进行处理:
bool isRunning(){return thread_->joinable();}
退出的线程不能加入吗?我错过了什么...... boost thread :: joinable是什么意思?
答案 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)
这可能不是你问题的直接答案,但我认为线程概念是一种非常轻量级的机制,除了同步机制外,故意没有任何东西。我认为放置“正在运行”的正确位置是在定义线程函数的类中。请注意,从设计角度来看,您可以在中断时退出线程,但仍然无法完成工作。如果要在线程完成后清理线程,可以将其包装在安全指针中并将其交给工人类。