什么时候thread.detach()函数的左值超出下面代码中的范围?

时间:2017-03-21 21:22:37

标签: c++ multithreading

假设我执行以下操作:

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
}

我希望主线程可用于执行其他操作,而我让分离的线程进行繁重的工作,在这种情况下,我是否正确地说,在scatndsiveFunction()完​​成之前,dummyData不会超出范围?< / p>

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

问题2:所以即使我不在函数B中使用thread.join(),如果functionB()只调用了expendsiveFunction(),那么线程t将在expendsiveFunction()的末尾终止? (如果functionB是另一个类的一部分..)

1 个答案:

答案 0 :(得分:1)

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

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

请注意,只有functionBexpensiveFunction拥有对此内存的引用,因此这些函数是唯一可以释放此内存的函数;如果他们不这样做,那么你就会有内存泄漏。

BTW:你的代码没有编译;但这不是问题所在。