[Lazarus] thread safe

Michael Schnell mschnell at lumino.de
Tue Jun 28 10:30:46 CEST 2011


On 06/27/2011 07:52 PM, Hans-Peter Diettrich wrote:
>
> You forget the strength of protection.
Maybe I seem to see what you mean.

You think, a critical section will not prevent that the data that is 
accessed by both threads is duplicated in a register or in the Data 
cache of the two (or more) CPUs that are trying to access the resource 
(variable). Thus a concurrent access might erroneously offer a not 
updated state to the other CPU.

But

Regarding Registers, the C language provides the "volatile" keyword to 
prevent the code from caching the values of such variables in registers. 
With Pascal (that does not have the volatile keyword), all static data 
is handled as volatile. This might in fact trigger a protection problem, 
as (AFAIK) data on the heap (e.g. class variables) are not handled as 
volatile. But this potential problem with threads accessing class 
variables or e.g. a linked list is independent from SMP. In fact I have 
no idea if/how this can be handled with Pascal-language means.

Regarding Data Cache, AFAIK, the hardware prevents this. If one CPU 
writes a value, an "invalidate" signal for the addresses in that cache 
line is sent to all caches, and so all other CPUs will reread the data 
from the main memory, which in turn will force a preliminary write from 
cache to main memory for the cache line of the first CPU.


If this would not be true, practically no threaded application would 
work, as a  thread would close to never see what another thread writes, 
as with today's huge cache sizes normally any data written by a thread 
resides completely in the "personal" cache of the CPU it runs on.

Thus "Locked" instructions (that force this mechanism, guaranteeing 
proper read-modify-write access even if multiple instructions access the 
same data are issued at the same time <overlapping execution> ) only are 
necessary outside a critical section protecting the data in question. 
(And this in fact is necessary to create the MUTEX/FUTEX functionality 
itself, and to do code the performance/latency of which would suffer too 
much from introducing critical sections.)

If you think I get this wrong, please do provide an example how you 
think such a conflict within a critical section might happen.


My conclusion is, that the said problem with linked lists results from 
the pointers not being defined as "volatile". And I really don't know 
how this could be cured in Pascal other than doing ASM. (I was not aware 
of this problem and I feel it should be discussed in the FPC mailing list.)

-Michael




More information about the Lazarus mailing list