[fpc-devel] Comparison FPC 2.6.2 - Delphi 7
Sven Barth
pascaldragon at googlemail.com
Wed Mar 6 14:36:42 CET 2013
Am 06.03.2013 14:29, schrieb Michael Schnell:
> On 03/06/2013 01:43 PM, Sven Barth wrote:
>>
>>> And how does one the "current" TThread?
>> Since a few weeks: TThread.CurrentThread ;)
>>
>
> This does in fact use a threadvar:
>
> threadvar
> { the instance of the current thread; in case of an external thread
> this is
> Nil until TThread.GetCurrentThread was called once (the RTLs need
> to ensure
> that threadvars are initialized with 0!) }
> CurrentThreadVar: TThread;
>
>
> and (unless the compiler optimizes this out) even accesses it twice:
>
>
> if not Assigned(CurrentThreadVar) then
> CurrentThreadVar := TExternalThread.Create;
> Result := CurrentThreadVar;
>
>
> From within the TThread object, simply using Self seems more
> appropriate unless there is a chance that the same TThread instance is
> used for multiple OS-Threads. I don't know if/how this is possible.
>
> From "outside" I feel that AnyThread.GetCurrentThread does not make
> much senses.
>
> When doing "TThread.GetCurrentThread" as a class function I think I
> should get "self" of same when I am in the code that is called from
> "Execute" of some TThread instance. I don't see what I want to see
> when I'm not.
>
> The code seems to try to avoid the case that a no TThread instance
> when GetCurrentThread is called as a a class function. I don't know
> if/how this is sensible.
>
> Using CurrentThread only seems sensible within the the code of a
> component that has been called by the code of a TThread instance. But
> here using an appropriate back-link property can easily be used to
> avoid accessing the threadvar. (or using CurrentThread once to set a
> property and then just accessing same.) But this of course needs to
> be done in user code and the RTL can't force it.
The TThread.CurrentThread is mainly for access in functions that don't
get passed a "TThread" instance and to also get a "TThread" instance for
threads not created by the RTL (the "TExternalThread.Create" line
above). Don't forget that TThread.CurrentThread is a class
property/function, so you can't access Self.
We could optimize it like this:
=== code begin ===
Result := CurrentThreadVar;
if not Assigned(Result) then begin
Result := TExternalThread.Create;
CurrentThreadVar := Result;
end;
=== code end ===
So that in the normal case only one access to the threadvar is used.
Regards,
Sven
More information about the fpc-devel
mailing list