std :: thread在我分离之前完成

时间:2014-12-10 05:50:34

标签: c++ multithreading c++11 detach stdthread

如果我创建一个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>

2 个答案:

答案 0 :(得分:2)

加入和分离具有相同的要求,它们必须是可加入的。所以我认为进行可连接检查就足够了。

If(trivial.joinable())
    trivial.detach();

文档states

  

已完成执行代码但尚未加入的线程仍被视为活动执行线程,因此可以加入。

所以我的猜测是分离的线程将立即停止存在。但它绝对可以创造。

注意: 在加入或分离线程之前始终调用joinable()是一种好习惯。

答案 1 :(得分:1)

线程对象将在其范围完成后被破坏。 要确保对象完成其工作,您需要调用join或detach。