[fpc-pascal] TThread.FreeOnTerminate

Luca Olivetti luca at ventoso.org
Fri Dec 14 19:56:51 CET 2018


El 14/12/18 a les 18:08, Jonas Maebe ha escrit:
> On 14/12/18 11:09, Luca Olivetti wrote:
>>
>> I think that TThread should have a method to kill it for such cases, 
>> using, e.g., pthread_cancel under unix
> 
> pthread_cancel() does not not kill a thread. Conceptually, it is exactly 
> the same as calling TThread.terminate: it just sets a property for the 
> thread to indicate someone wants it to stop. The thread will only stop 
> the next time pthread_testcancel() gets subseaquently called from inside 
> this "cancelled" thread, which should only be done at well-defined 
> points so the chances at leaving stray locks etc behind are minimalised.

Oh, I'm not familiar with those APIs (that's why I use freepascal ;-), I 
just looked at the implementation of a thread class in vdr 
(http://www.tvdr.de/) documented this way:

   void Cancel(int WaitSeconds = 0);
        ///< Cancels the thread by first setting 'running' to false, so that
        ///< the Action() loop can finish in an orderly fashion and then 
waiting
        ///< up to WaitSeconds seconds for the thread to actually end. 
If the
        ///< thread doesn't end by itself, it is killed.
        ///< If WaitSeconds is -1, only 'running' is set to false and 
Cancel()
        ///< returns immediately, without killing the thread.



and the method uses pthread_cancel. So the documentation of that class 
is misleading.
I also read the manual page for pthread_cancel and even when using 
pthread_canceltype(PTHREAD_CANCEL_AYNCHRONOUS) "The thread can be 
canceled at any time.  (Typically, it will be canceled immediately upon 
receiving a cancellation request, but the system doesn't guarantee this.)".


Bye
-- 
Luca



More information about the fpc-pascal mailing list