[fpc-devel] ref count types / threadsave question

Jonas Maebe jonas at freepascal.org
Wed Jan 2 21:52:59 CET 2019


On 02/01/19 21:46, Martin Frb wrote:
> On 02/01/2019 21:22, Benito van der Zander wrote:
>> Hi,
>>
>> but if another core can do anything to the string, the refcount should 
>> already be 2, one for this core and one for the other core, should it not?
> No:
> 
> // global var
> var
>    Foo: String;
> 
> // main thread
> Foo := getsomestring_with_refcount_1();
> TMyThread.Create(false); // not suspended / start
> 
> Foo := ''; // de-ref
> 
> //TMyThread.Execute
> LocalFoo := Foo; // copy from the global var

This is a different issue. Managed types are indeed only threadsafe as 
long as there is no race condition that could cause their refcount to 
become zero at some point.

The issue I was talking about is the fact that atomic operations do 
function as global memory synchronisation operations across all cores 
(at least not on all architectures). If core 1 atomatically increases 
refcount to two and you "then" load the same refcount normally (without 
an atomic read-modify-exchange oepration) on another core, this other 
core may still see the old value.

The reason "then" is between quotes is because there is no forced 
ordering between these two operations (since there is no 
synchronisation/memory barrier linking the the two), which is also the 
basis of the problem.

See e.g. 
https://homes.cs.washington.edu/~bornholt/post/memory-models.html for 
more information.


Jonas



More information about the fpc-devel mailing list