分离呼叫未按预期工作

时间:2019-05-02 18:31:23

标签: multithreading c++11 detach

需要帮助,为什么以下代码的工作方式有所不同。 在此代码中,线程在主出口后不打印任何内容:

#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上搜索,但没有运气。

编辑1: 第一个程序的结果:

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

第二个程序的结果:

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

1 个答案:

答案 0 :(得分:0)

该代码对我来说似乎正确执行。

通常在thread的析构函数运行时,它将等待线程完成后再退出。但是,当您调用detach()时,您正在避开此行为-当前方法不会等待线程完成。

由于线程将运行(大约)6秒钟,因此main()中的睡眠不会等待足够长的时间才能完成威胁,因此它将在线程完成之前退出。根据环境的不同,退出main()也会退出程序-这意味着线程永远不会有机会在程序退出之前打印其所有消息。

如果要显式等待线程完成再继续执行,则应调用thread::join()