thread.detach() 函数的左值何时会超出以下代码的范围

when will the lvalue of a thread.detach() function goes out of scope in the code below?

本文关键字:范围 代码 何时会 detach 函数 thread      更新时间:2023-10-16

>假设我执行以下操作:

void functionA(const char const input, int size)
{
   char* dummyData = new char[size] ;
   thread t(&functionB, dummyData);
   t.detach();
}
void functionB(const char* data)
{
   thread t2(&expendsiveFunction, data);
   t2.join();
}

void expendsiveFunction(const char* data)
{
    //do some expendsive stuff
   delete[] data;
}
void main()
{
   char* dataFromExternalSource;  //lets assume this was provided from by an external soruce receive via TCP
   functionA(dataFromExternalSource);
   //do other stuff
}

我希望主线程可用于做其他事情,而我让分离的线程做艰苦的工作,在这种情况下,我说 dummyData 在 expendsiveFunction(( 完成之前不会超出范围是对的吗?

任何建议/评论都会有所帮助。

问题 2:所以即使我不在函数 B 中使用 thread.join((,如果函数 B(( 只是调用 expendsiveFunction(( ,线程 t 也会在 expendsiveFunction(( 结束时终止?(如果函数 B 是另一个类的一部分。

我会

说你说你不对,因为局部变量dummyDatafunctionA完成时超出范围,functionA不会等待任何其他函数或线程完成。

但是,dummyData指向的内存将保持有效,因为您使用 new[] 动态分配它。此内存在堆上,它永远不会"超出范围",因为它永远不会从堆栈中弹出;它将保持有效,直到您在代码中的某处调用delete[]

请注意,只有functionBexpensiveFunction保存对此内存的引用,因此这些函数是唯一可以释放此内存的函数;如果没有,那么您将有内存泄漏。

顺便说一句:你的代码不会编译;但这不是这里的问题。