如果我创建一个std :: thread,在我能够在其上调用detatch()
之前终止,那么预期的行为是什么?是否应该因joinable
已经错误而抛出异常?
如果是这样,那么有没有办法创建一个初始化为分离状态的线程,以便我可以避免这个错误?
示例:
void func()
{
// do something very trivial so that it finishes fast
int a = 1;
}
void main()
{
thread trivial(func);
trivial.detach();
}
我意识到在实践中产生一个线程来做琐碎的工作并不是很实际,但是我确实遇到了这种行为,我很想知道它是否有办法... < / p>
答案 0 :(得分:2)
加入和分离具有相同的要求,它们必须是可加入的。所以我认为进行可连接检查就足够了。
If(trivial.joinable())
trivial.detach();
文档states:
已完成执行代码但尚未加入的线程仍被视为活动执行线程,因此可以加入。
所以我的猜测是分离的线程将立即停止存在。但它绝对可以创造。
注意:强>
在加入或分离线程之前始终调用joinable()
是一种好习惯。
答案 1 :(得分:1)
线程对象将在其范围完成后被破坏。 要确保对象完成其工作,您需要调用join或detach。