Re: Problem killing a thread
On 21 Jul 2006 14:06:32 -0700, "Jon" <TheFakeJon@gmail.com> wrote:
Hello,
I am creating a DLL that creates another thread and does its work.
When I load the library, it calls CreateThread which spawns another
thread. I am having a hard time terminating the thread. For some
reason, when it runs DLL_PROCESS_DETACH, and executes TerminateThread,
the thread does not terminate.
Well, TerminateThread should be avoided for the reasons given here:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/terminatethread.asp
On the plus side, it doesn't call DllMains with DLL_THREAD_DETACH, so it
shouldn't deadlock due to DllMain serialization, which would otherwise
occur if you were waiting on the thread to exit normally during
DLL_PROCESS_DETACH.
Would anyone know what I could be doing wrong?
It seems fairly simple. Thanks
I have the following code:
////////////////////////////////////////////////////////////////
long WINAPI Temp(long lParam) {
int result;
for(;;) {
// my new thread
}
return 0;
}
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call,
LPVOID lpReserved ) {
HANDLE hThread = new HANDLE();
That's genuinely twisted. :) It works only because HANDLE is a typedef for
void*, and new of course returns a pointer. What you want is simply:
HANDLE hThread = 0;
Then get rid of the delete below. For reference, here's a corrected version
of what you have above:
HANDLE* p = new HANDLE();
This creates a new HANDLE and zero-initializes it because you wrote
HANDLE() with parens.
DWORD dwID;
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Temp, NULL,
0, &dwID);
This overwrites the pointer stored in hThread.
break;
case DLL_PROCESS_DETACH:
TerminateThread(hThread, 0);
CloseHandle(hThread);
delete(hThread);
This delete is undefined if thread creation succeeded in
DLL_PROCESS_ATTACH, because you would then be deleting a non-null pointer
you didn't allocate. The solution to all this was given earlier.
MessageBox(NULL, "Detaching Process", "Note", MB_OK);
break;
default:
break;
}
return TRUE;
}
Doing those things inside DllMain is risky at best. For more on the DllMain
restrictions, see:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/dllmain.asp
http://www.microsoft.com/whdc/driver/kernel/DLL_bestprac.mspx
For an MFC problem in this area, see:
http://support.microsoft.com/?kbid=142243
I'm afraid the best approach is for your DLL to expose functions that let
the EXE coordinate thread creation and termination.
--
Doug Harrison
Visual C++ MVP