[fpc-pascal] What's the deal with CloseThread?

Sven Barth pascaldragon at googlemail.com
Wed Apr 24 09:53:06 CEST 2013


Am 23.04.2013 22:40, schrieb Anthony Walter:
> Thanks for so much Sven. I have another question.
>
> Is it okay for a thread to close itself before it's finished? Because 
> I believe that is what happens when FreeOnTerminate is set to True. 
> Here is a brief synopsis of what can execute:
>
> In rtl/objpas/classes/classes.inc
>
> Line 168: FreeThread := Thread.FFreeOnTerminate; // captures free on 
> termiante
> Line 173: Thread.Free; // invokes the destructor from within the thread
> Line 197: CloseThread(FHandle); // thread is closed in destructor 
> TThread.Destroy;
> Line 174: EndThread(Result); // flow returns here, but the thread was 
> already closed
>
> So what it looks like is that we expect code inside a thread continue 
> running after it has been closed.
>
That's ok, because the FHandle is information which is retrieved in the 
context of the calling thread (e.g. the main thread). And if we don't 
need any more information about the thread we just close it's handle 
(equivalent to CloseThread) and be done with it. EndThread on the other 
hand is called in the context of the called thread.

Afterall you also normally close the thread handle which you get 
returned by a CreateProcess(?) call, but keep the process handle around.

With CloseHandle (and the semantically equal CloseThread) you just tell 
the system that you don't plan to interact with the object that the 
handle references (in this case a thread) anymore.

Regards,
Sven



More information about the fpc-pascal mailing list