std::线程在我分离它之前完成

std::thread finishes before I can detach it

本文关键字:分离 线程 std      更新时间:2023-10-16

如果我创建了一个在我能够调用detatch()之前终止的 std::thread,预期的行为是什么?是否应该因为joinable已经是假而引发异常?

如果是这样,那么有没有办法创建一个初始化为分离状态的线程,以便我可以避免此错误?

例:

void func()
{
    // do something very trivial so that it finishes fast
    int a = 1;
}
void main()
{
    thread trivial(func);
    trivial.detach();
}
我意识到在实践中生成

一个线程来做琐碎的工作并不实用,但是我确实设法遇到了这种行为,我很想知道是否有办法解决它......

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

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

文档指出:

已完成代码执行但尚未联接的线程

仍被视为活动执行线程,因此是可联接的。

所以我的猜测是分离的线程将立即不复存在。但它肯定是可以创建的。

注意:最好始终在联接或分离线程之前调用joinable()

线程

对象在其作用域完成时将被破坏。要确保该对象完成其作业,您需要调用 join 或分离。