¿Por qué .join sigue siendo necesario cuando todos los otros hilos han terminado antes del hilo principal?

Aprendizaje C ++ multi-threading.
En mi ejemplo, hilohelper1 yhelper2 haber terminado de ejecutar antes de lamain hilo terminado. Sin embargo, el programa se bloquea. Yo específicamente, saqué.join() declaraciones, para ver cómo se comportaría el programa, sin esperar errores, ya quemain() llamadasstd::terminate después de que otros dos hilos hayan terminado.

void foo()
{
    // simulate expensive operation
    std::this_thread::sleep_for(std::chrono::seconds(5));
    std::cout << "t1\n";
}

void bar()
{
    // simulate expensive operation
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "t2\n";
}

int main()
{

    std::cout << "starting first helper...\n";
    std::thread helper1(foo);

    std::cout << "starting second helper...\n";
    std::thread helper2(bar);


    std::this_thread::sleep_for(std::chrono::seconds(10));

    std::cout << "waiting for helpers to finish..." << std::endl;
    //helper1.join();
    //helper2.join();

    std::cout << "done!\n";
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta