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
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to