t.join()

join 方法用于同步主线程和子线程。也就是说,当主线程调用子线程的 join 方法时,主线程会被阻塞,直到子线程完成其执行。这意味着 join 方法确保主线程等待子线程结束,然后继续执行后续代码。

#include 
#include 
void threadFunction() {
    std::cout << "Thread is running..." << std::endl;
}
int main() {
    std::thread t(threadFunction);
    // 等待线程t完成
    t.join();
    std::cout << "Thread has finished." << std::endl;
    return 0;
}

在这个示例中:

t.()

方法则是让子线程在后台独立运行,与主线程分离。分离后的线程(也称为“游离线程”)不能再被 join,它的资源会在该线程完成后自动释放。主线程会继续执行而不会等待该子线程。

#include 
#include 
#include 
void threadFunction() {
    std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时任务
    std::cout << "Thread is running..." << std::endl;
}
int main() {
    std::thread t(threadFunction);
    // 分离线程t,使其在后台运行
    t.detach();
    std::cout << "Main thread is not blocked." << std::endl;
    // 主线程继续执行其他工作
    std::this_thread::sleep_for(std::chrono::seconds(3)); // 确保主线程不立即退出
    return 0;
}

在这个示例中:

如果把std::::(std::::(3)); // 确保主线程不立即退出注释掉:

使用场景 使用 join 使用 内存泄漏和资源泄漏风险 未管理的资源:分离的线程继续运行,而主线程不再追踪其状态或结果。如果分离线程未能正确释放其资源,会导致资源泄漏。例如,动态分配的内存、未关闭的文件句柄等。线程生命周期难以管理:一旦线程分离,主线程无法join它。这意味着主线程不能直接等待线程完成,必须通过其他方式(如条件变量或信号)来确保线程已完成。否则,主线程可能会在分离的线程完成之前退出,这样会导致未定义行为(如访问已被释放的内存)。程序终止:如果主线程在分离的线程完成之前结束,程序中主线程所占用的资源(如堆栈、静态成员等)将会释放,但分离线程仍然在尝试访问这些资源,可能导致程序崩溃。 解决方法

未经允许不得转载! 作者:admin,转载或复制请以超链接形式并注明出处墨迹游戏网

原文地址:《C++ std::thread 管理线程生命周期:join 和 detach》发布于:2024-11-26