运行以下代码:
runChatBubbleThread(){
// code here
sleep(2000);
// more code here
}
runChatBubbleThread:
t
我的理解是新威胁sleep()
已创建,执行其代码,然后在主线程完成后加入主线程,是否有t.join
睡眠主线程的原因?
我唯一可以想到的是{{1}}在主线程上继续之前等待线程完成,但是如果它必须等待,那么线程是什么呢?
答案 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)