вызов отсоединения не работает в соответствии с ожиданиями - PullRequest
0 голосов
/ 02 мая 2019

Нужна помощь, почему приведенные ниже коды работают по-разному.В этом потоке кода ничего не выводится после основного выхода:

#include <iostream>
#include <chrono>
#include <thread>

using namespace std;

void Run()
{

        cout<<"=== "<< "start_point" <<" ==="<<endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));

        cout<<"=== "<< "start_point" <<" ==="<<endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));

        cout<<"=== "<< "start_point" <<" ==="<<endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));

        cout<<"=== "<< "start_point" <<" ==="<<endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));

        cout<<"=== "<< "start_point" <<" ==="<<endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));

        cout<<"=== "<< "start_point" <<" ==="<<endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));

        cout<<"=== "<< "start_point" <<" ==="<<endl;

}

int main()
{
    std::thread th(Run);

    th.detach();

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

    cout<<"==== Ending main ==="<<std::endl;
}

Но здесь правильные сообщения печатаются после выхода из потока:

void independentThread() 
{
    std::cout << "Starting concurrent thread.\n";
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::cout << "Exiting concurrent thread.\n";
}

void threadCaller() 
{
    std::cout << "Starting thread caller.\n";
    std::thread t(independentThread);
    t.detach();
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "Exiting thread caller.\n";
}

int main() 
{
    threadCaller();
    std::this_thread::sleep_for(std::chrono::seconds(1));
}

Должно быть что-то очень маленькое, и мне его не хватает,Информация о компиляторе: g ++ / Mac / c ++ 11

попытался выполнить поиск в Google, но не удача.

Edit-1: Результат для первой программы:

=== start_point ===
=== start_point ===
==== Ending main ===

Результат для 2-й программы:

Starting thread caller.
Starting concurrent thread.
Exiting thread caller.
Exiting concurrent thread.

1 Ответ

0 голосов
/ 02 мая 2019

Этот код выглядит так, как будто он выполняется правильно для меня.

Обычно, когда работает деструктор thread, он будет ждать окончания потока, прежде чем выйти. Однако, когда вы вызываете detach(), вы обходите это поведение - текущий метод не будет ожидать завершения потока.

Поскольку поток будет работать (приблизительно) 6 секунд, режим сна в main() не будет ждать достаточно долго, чтобы угроза закончилась, поэтому он выйдет до завершения потока. В зависимости от среды, возможно, что выход из main() также приведет к выходу из программы - это означает, что поток не сможет распечатать все свои сообщения до выхода из программы.

Если вы хотите явно дождаться завершения потока, прежде чем продолжить выполнение, вам следует вызвать thread::join().

...