C ++新线程睡眠主线程

时间:2015-08-21 20:19:46

标签: c++ multithreading

运行以下代码:

runChatBubbleThread(){
    // code here
    sleep(2000);
    // more code here    
}

runChatBubbleThread:

t

我的理解是新威胁sleep()已创建,执行其代码,然后在主线程完成后加入主线程,是否有t.join睡眠主线程的原因?

我唯一可以想到的是{{1}}在主线程上继续之前等待线程完成,但是如果它必须等待,那么线程是什么呢?

3 个答案:

答案 0 :(得分:7)

thread.join的目的是阻止线程死亡。如果您想在等待新线程之前在主线程中执行某些操作,请在join之前执行此操作。

答案 1 :(得分:1)

一些简单的方法可以做到这一点。

jwde涵盖了第一个

void methodOne(){
    std::thread t(&ChatBubble::runChatBubbleThread, this);
    // do other stuff that needs to be done here.
    t.join(); // wait for thread to finish before returning in case thread
              // is not done
}

当我打字时,John C插入了第二个。

void methodTwo(){
    std::thread t(&ChatBubble::runChatBubbleThread, this);
    t.detach(); // let thread run to completion on it's own time
}

但是关于分离的警告。如果主线在线程完成之前退出......你将度过糟糕的一天。您可能希望密切关注已运行的线程,以确保它们在退出程序之前完成。

方法三:

void methodThree(std::vector<std::thread> & threads){
    threads.emplace_back(&ChatBubble::runChatBubbleThread, this);
}

位于主

的底部
int main()
{
    std::vector<std::thread> threads;
    ...

    object.methodThree(threads);

    ...

    for (std::thread &t: threads)
    {   
        t.join();
    }
    return result;
}

随着时间的推移,编辑添加这个不会很好的扩展。线程将在向量中积累,即使它们已经停止,因此需要不时地运行清理程序来检测,删除和处理已完成的线程。

编辑2:错过了&amp;得到参考。由于很多原因,无法复制线程。

编辑2B。是。这会堵塞挂线。我想说在我的代码中永远不会发生,但要查看几行。

通常我的线程的执行循环看起来像这样:

while (!terminated)
{
    // do stuff, but no blocking operations without a timeout.
}

如果仍然挂起,调试器就出来了。我不得不说,如果没有用计时器上的炸弹缠绕回路,我就没有好处。

答案 2 :(得分:0)

线程在构建后立即运行。

t.join确实等待线程t完成。它不必等待;你不必致电joinjoin是同步线程;有时你想要主要等待(通常,可以说,总是,不是马上,但是在做了一些你希望并行的其他任务之后)。 “该函数在线程执行完成后返回。” Source

另一方面,您可以使用detach“从调用线程中分离由对象表示的线程,允许它们彼此独立地执行。” Source。你应该在调用线程的析构函数之前调用detach