C++ 带有堆栈变量的pthread内存泄漏
我注意到,当我使用窗体中的线程调用方法时C++ 带有堆栈变量的pthread内存泄漏,c++,multithreading,memory-leaks,pthreads,C++,Multithreading,Memory Leaks,Pthreads,我注意到,当我使用窗体中的线程调用方法时 ////main code///// pthread_t thread; pthread_create(thread,function,data); ////////////////// void* function(void* data){ //work with some data on the heap via a vector on the stack std::vector<double> variable (
////main code/////
pthread_t thread;
pthread_create(thread,function,data);
//////////////////
void* function(void* data){
//work with some data on the heap via a vector on the stack
std::vector<double> variable (100,1.2345);
//do contents of thread
pthread_exit(NULL);
}
内存泄漏没有发生
似乎pthread\u exit(NULL)
不会像使用return
在正常函数结束时那样清除堆栈变量(我是对的?!),因此将它们放在自己的范围内可以确保它们被释放
然而,这似乎是一个巨大的难题。如何确保在退出pthread时正确清除堆栈变量(以及它们在堆中的容器内容)?对new()
的调用隐藏在std::vector
实现中
在第一个代码示例中pthread_退出(NULL)在调用std::vector
析构函数之前,code>将退出线程,因此内存泄漏
第二个示例强制在pthread_退出(NULL)之前调用std::vector
的析构函数代码>
似乎pthread\u exit(NULL)
没有清除堆栈变量,就像您在返回正常函数结尾时得到的那样(我是正确的?!)
这就像在非线程代码中调用exit(0)
,程序会立即退出,而不会释放堆栈。(因为pthSPEC是用C定义的,而不是C++,它不定义C++析构函数会发生什么,所以它是平台特定的)。
因此,将它们放在自己的范围内可以确保它们得到释放
因为这样,向量的析构函数在调用pthread\u exit()
之前运行
如何确保在退出pthread时正确清除堆栈变量(以及它们在堆中的容器内容)
只要从线程函数返回,就不需要使用pthread\u exit
退出线程启动函数(传递给pthread\u create
)。说:
当第一次调用main()
的线程以外的线程从用于创建它的启动例程返回时,会隐式调用pthread\u exit()
同样的事情,他说的略有不同:
从任何线程的start函数执行返回,而不是
主线程使用
函数的返回值作为线程的退出状态
您可以使用pthread\u exit
从堆栈下的其他函数中退出线程,就像您可以使用exit()
退出程序,而不是从main()
返回,但在最外层的函数中只返回NULL代码>(或任何您想要的返回值)
唯一一次使用pthread\u exit(x)
只需返回x代码>位于main
中,它将导致程序等待其他线程完成。(好的,我可以看到其他人已经解决了这个问题……是的,这只适用于可接合线程。如果尝试分离不可接合的线程,则会引发错误。)
您需要调用pthread\u detach(…)
来配置pthread,以便在退出时回收资源
这并不是要使其他任何答案无效。但是,如果希望在退出时回收其堆栈空间,则需要分离任何未加入的可加入子线程!你为什么不想这样
即使您通过更改代码来解决这个特定的漏洞,如果您要在C/C++中使用子线程编程,也需要进一步了解这个问题std::thread
和boost::thread
有类似的要求。什么平台?什么编译器选项?(由于某些原因,堆栈没有展开。这可能是因为您没有指定平台所需的编译器选项。)啊,我明白了,出于某种原因,我在脑海中想,您需要调用pthread\u exit()
,因此产生了混乱。经过测试,它解决了这个问题。谢谢。除此之外,另一个可能的泄漏源是,如果pthread被创建为一个可连接线程(默认),那么一个线程会一直保留资源(通常是整个线程堆栈),直到有人在该线程上调用pthread_join(),所以请确保该线程是一个分离的线程,或者确保有人在该线程上调用pthread_join()。
void* function(void* data){
{
std::vector<double> variable (100,1.2345);
//do contents of thread
}
pthread_exit(NULL);
}