Re: Monitor Thread In DLL

Tech-Archive recommends: Fix windows errors by optimizing your registry

From: Pavel Lebedinsky (m_pll)
Date: 12/10/04


Date: Fri, 10 Dec 2004 14:09:10 -0800

I would go with a cleanup function. If clients forget to call it
then the thread will be terminated but you should be able
to handle this case anyway (meaning it shouldn't cause
permanent corruption of on-disk data etc), because in the end
nothing prevents the user from killing your process with taskmgr
or kill.exe.

By the way, if you want to be able to unload the DLL
at runtime, take a look at the FreeLibraryAndExitThread
API.

"Matt" wrote:

>
> Hi,
>
> I am creating a monitor thread in a WIN32 DLL. I'd like the monitor
> thread to stay around for the life of the DLL and then exit cleanly before
> the DLL is detached.
>
> My problem is, I do not know how to "safely" do this. I have tried using
> the atexit() function inside the DLL to trigger the monitor thread
> termination, but it is already too late by then. It looks like the C++
> run time calls:
>
> atexit() for the EXE
> ExitProcess() -> Kills all active worker threads using TerminateThread().
> atexit() for each DLL during the detach phase.
>
> I really want to avoid having my worker thread killed by
> TerminateThread(). I could get around this by requiring the user to call
> some type of cleanup function, but I would like to avoid doing that as
> well (because some users may forget to call it).
>
> CleanupStuff(), waits for thread shutdown. Cleans up the thread nicely.
> atexit() for the EXE
> ExitProcess() -> Kills all active worker threads using TerminateThread().
> atexit() for each DLL during the detach phase.
>
> I could try implicitly loading the atexit() function for the executable
> and add in my cleanup code there, but that seems very much like a hack to
> me.
>
> LoadLib for the atexit() func for the EXE. Call it.
> atexit() for the EXE. Calls my cleanup function and waits for thread
> shutdown. Cleans up the thread nicely.
> ExitProcess() -> Kills all active worker threads using TerminateThread().
> atexit() for each DLL during the detach phase.



Relevant Pages

  • Re: Monitor Thread In DLL
    ... Runtime calls atexitfor the EXE. ... Runtime calls atexit() for the DLL during the detach phase. ... > finally wait for the thread to exit using WaitForSingleObject.. ...
    (microsoft.public.win32.programmer.kernel)
  • Re: Monitor Thread In DLL
    ... reference count on the dll for each worker thread. ... if you want to be able to unload the DLL ... >> atexit() for the EXE ... >> some type of cleanup function, but I would like to avoid doing that as ...
    (microsoft.public.win32.programmer.kernel)
  • Re: Monitor Thread In DLL
    ... > mainexits in the EXE. ... > Runtime calls atexitfor the EXE. ... > Runtime calls atexit() for the DLL during the detach phase. ... >>message that your DLL will receive just before it is unloaded?? ...
    (microsoft.public.win32.programmer.kernel)
  • Re: Monitor Thread In DLL
    ... > ExitProcess() kill the worker threads using TerminateThreadbefore ... > Runtime calls atexit() for the DLL during the detach phase. ... >> message that your DLL will receive just before it is unloaded?? ... >> then signal an event that your monitor thread is listening on, ...
    (microsoft.public.win32.programmer.kernel)
  • Monitor Thread In DLL
    ... I am creating a monitor thread in a WIN32 DLL. ... atexit() for the EXE ... I really want to avoid having my worker thread killed by TerminateThread(). ...
    (microsoft.public.win32.programmer.kernel)