Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STD::线程应该在堆上或堆栈上创建_C++_Multithreading_Heap Memory_Stack Memory_Detach - Fatal编程技术网

C++ STD::线程应该在堆上或堆栈上创建

C++ STD::线程应该在堆上或堆栈上创建,c++,multithreading,heap-memory,stack-memory,detach,C++,Multithreading,Heap Memory,Stack Memory,Detach,假设我有一个正在堆栈上创建和分离的线程,如下所示: void foo() { while(true){}; } void runThread() { std::thread t(foo); t.detach(); } int main() { runThread(); } 这个程序当然没有任何意义,但是在我们分离并退出runThred之后会发生什么呢?它是在堆栈上分配的,因此在退出runThred后,基本上t将被销毁,但是线程本身将继续运行,而与主线程无关,

假设我有一个正在堆栈上创建和分离的线程,如下所示:

void foo()
{
    while(true){};
}

void runThread()
{
    std::thread t(foo);
    t.detach();
}

int main()
{
    runThread();
}
这个程序当然没有任何意义,但是在我们分离并退出runThred之后会发生什么呢?它是在堆栈上分配的,因此在退出runThred后,基本上t将被销毁,但是线程本身将继续运行,而与主线程无关,因为它是分离的

在这样的示例中,最好的做法是在堆上创建它并保存指向它的指针,然后执行dcor操作吗


或者,如果t变量被破坏,我们就应该忽略它,这意味着什么都没有

std::thread对象表示线程的句柄,通过该句柄可以对其进行操作。但是一旦调用detach,对象和实际执行线程之间就没有任何连接。

std::thread对象表示线程的句柄,可以通过该句柄对其进行操作。但是一旦调用detach,对象和实际执行线程之间就没有连接。

为什么要保留指向它的指针?一旦调用detach,您就不再拥有该线程。那么“t”会发生什么呢?它被杀了,但没什么意义?你应该看看报纸。它解释了这是如何工作的。一旦你拆下t,它就是一个僵尸。销毁它是一个NOP.std::thread tfoo应该是std::thread tfoo为什么要保留指向它的指针?一旦调用detach,您就不再拥有该线程。那么“t”会发生什么呢?它被杀了,但没什么意义?你应该看看报纸。它解释了这是如何工作的。一旦你拆下t,它就是一个僵尸。销毁它是一个NOP.std::thread tfoo应该是std::thread tfoo