分离一个线程然后让它超出范围(让它仍然运行)是否安全?

时间:2018-05-24 08:53:14

标签: c++ stdthread detach

我有以下代码,我觉得它可以正常工作(原谅愚蠢/做作的例子)。

void run_thread()
{
    std::thread t([]{
        while(true)
        {
            // keep getting chars... to stop peoples eye's hurting : )
            char c = getchar();
        }
    });

    t.detach(); // Detach thread

    // thread goes out of scope here - but is it ok because its detached??
}

int main()
{
     run_thread();    

    // Wait here forever
    while (true) {;}
}

但重新阅读之后,我对此表示怀疑。线程t超出范围。我现在不记得你在调用detach()后这样做是否安全...我认为是这样,但正如我所说,我有一个唠叨的怀疑。任何人都可以确认这是好/坏的做法吗?

4 个答案:

答案 0 :(得分:2)

  

线程t超出范围。我现在不记得是否安全   在调用detach()

之后

detach()因为您想要将实际运行的线程与线程对象取消关联。所以在} t超出范围但实际线程将继续运行直到其指令完成。

如果detach() std::terminate没有在}杀死该帖子

答案 1 :(得分:2)

detach基本上释放了std::thread对象实例,它是实际操作系统线程的C ++“句柄”,因此以后无法join该线程。

在大多数情况下,最好将thread实例保留在某个全局范围内,以便以后可以join,例如在退出main之前。这样你就可以确保所有线程在主线程之前完成。

例如:

std::thread t; // can be "empty"

void run_thread()
{
    t = std::thread([]{
        while(true)
        {
            // keep getting chars...
            char c = getchar();
        }
    });

}

int main()
{
     run_thread();    

    // Wait here
    std::this_thread::sleep_for(30s);

    // Before exiting wait for the thread to finish
    if (t.joinable())
        t.join();
}

答案 2 :(得分:1)

这种用法是分离的

答案 3 :(得分:1)

是的,你的代码是安全的。但它没有任何意义。 main函数将利用CPU,并且线程函数将获得更少的CPU时间。您可以附加到永久线程并达到类似行为:run_thread永远不会退出,因此main永远不会退出。

void run_thread()
{
    std::thread t([]{
        while(true){/* also run forever */;}
    });

    // Wait here forever
    t.attach();
}

int main()
{
     run_thread();    
}