Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / C++

Terminate a hanging thread

4.94/5 (9 votes)
16 Jan 2012CPOL 47.9K  
How to avoid memory leak in WinXP, if you kill a thread

I wrote some code to display all open handles in the system. This is usually a device driver job, but I wrote a workaround for it... The problem was only that my thread was hanging occasionally in an undocumented API. ;)


It wasn't a problem to kill this thread and create another one, but in WinXP this generates a memory leak: The stack isn't freed via TerminateThread(). This doesn't happen in Vista and newer systems.


Therefore I used another undocumented API:


C++
typedef	VOID (WINAPI *PRtlFreeUserThreadStack)(HANDLE hProcess, HANDLE hThread);
static PRtlFreeUserThreadStack RtlFreeUserThreadStack=NULL;

HMODULE NTLibrary = GetModuleHandleW(L"ntdll.dll");
RtlFreeUserThreadStack = (PRtlFreeUserThreadStack)GetProcAddress(NTLibrary, "RtlFreeUserThreadStack");

The nice thing is, that RtlFreeUserThreadStack() is only available in WinXP and older systems. Therefore the rule is: Use it, if it is available.


C++
void KillThread(HANDLE threadHandle)
{
   //SetEvent(waitEvent);
   DWORD dwExitCode;
   GetExitCodeThread(threadHandle, &dwExitCode); // check again
   if(dwExitCode == STILL_ACTIVE)
   {
      if(RtlFreeUserThreadStack != NULL)
         RtlFreeUserThreadStack(GetCurrentProcess(), threadHandle);
      TerminateThread(threadHandle, 0); 
   }
   CloseHandle(threadHandle);
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)