调用std::thread::detach后,线程仍运行时析构std::thread变量是否安全?
问题解答
调用std::thread::detach()是足够的,析构已经调用过detach()的std::thread对象不会引发任何问题,哪怕对应的线程仍在运行。
具体解释:
std::thread::detach()的核心作用是将线程与当前std::thread对象解绑,解绑后该对象不再关联任何实际的执行线程。此时线程会转为后台运行状态,其生命周期不再受这个std::thread对象的控制,线程完成后会由操作系统自动回收资源。- 当
std::thread对象处于“未关联任何线程”的状态(调用过detach()或者join()之后),它的析构函数只会执行常规的对象清理操作,不会触发任何异常或未定义行为。 - 只有当
std::thread对象关联着一个未被join()或detach()的线程时,析构它才会导致std::terminate()被调用,直接终止程序——这是std::thread的安全保障机制,避免线程资源泄漏或悬空引用。
针对你的代码补充说明:
你的代码中,foo()函数里的mythread调用detach()后,即使后台线程还在执行冗长的处理逻辑,mythread对象离开作用域被析构时也完全安全。需要注意的是,如果你的lambda表达式捕获了foo()中的局部变量(而非代码里的传参0),那么当foo()执行完毕局部变量销毁后,后台线程访问这些已销毁的变量会导致未定义行为,但这和std::thread对象的析构无关,属于另一种常见的线程安全问题。
内容的提问来源于stack exchange,提问作者Jabberwocky
相关产品推荐
相关产品推荐

