CreateThread后跟TerminateThread留下了大量内存

时间:2012-09-03 05:06:27

标签: c++ windows multithreading winapi

我正在使用CreateThread,然后使用TerminateThread取消线程。似乎仍然分配了堆栈空间。有办法解决这个问题吗?我没有使用任何形式的动态内存调用,如malloc / new。线程不必正常退出。 10个线程留下了高达5 MB的内存!线程都在代码的不同部分,因此是否有一种简单的方法来实现一个线程间通信系统,它可以告诉它们所有的优先退出,从而重新调整堆栈的方向?

2 个答案:

答案 0 :(得分:11)

在大多数情况下,您应使用TerminateThread()。如果在应用程序中创建新线程,则您有责任确保这些线程正常退出。使用TerminateThread()时,可能会遗留所有类型的资源,因为此函数只是终止线程而不调用清理函数。

TerminateThread documentation

你应该做的是使用事件(或其他信令方法)告诉你的线程他们应该关闭。当线程在内部接收消息(事件发出信号或等待到期等)时,线程函数可以在内部清理并返回。这样你就可以正确地退出你的线程,而不会留下任何一团糟。

答案 1 :(得分:3)

主线程上的非自动重置事件和WaitForMultipleObjects将执行您想要的操作。如果您发现自己超过64个并发工作线程,则必须重新调整以使用不同的方法,例如非自动重置事件和信号量。有几十种方法可以解决这个问题,在互联网论坛上有无数的例子,以及MS在Visual Studio发行版中的例子。从那些开始。