[Lazarus] thread safe

José Mejuto joshyfun at gmail.com
Tue Jun 28 19:06:45 CEST 2011


Hello Lazarus-List,

Tuesday, June 28, 2011, 6:44:17 PM, you wrote:

I can only talk about Win x86, so things could be different in other
OS.

AB> Your assumption would be incorrect.  The system doesn't do anything
AB> but decrease the spincount of the criticalsection object to make sure
AB> the variable is valid.  As stated before by numerous people, a
AB> CriticalSection does not apply to variable assignments.  It just
AB> blocks entrance to code blocks unit the lock is released.

In Win a Critical section do more things than increase, decrease the
recursion count, if first try to detect the Critical adquisition using
a memory barrier/atomic (exchange). If adquire fails it "spins", not
exactly spins but valid for this text, until it success.

The try to adquire imposes a non reorder and cache coherence across
threads, cores and processors. As much the critical spin to lock the
critical section CPU performance is degradated due constantly memory
fences.

*** This will never work as thread 2 does not use the protection
mechanism expected by thread 1.

Thread/core/processor 1
-----------------------
while true do begin
  Critical.Enter;
  a:=a+1;
  b:=a;
  Critical.Leave;
end;

Thread/core/processor 2
-----------------------
while true do begin
  if a<>b then Raise Exception.Create('KBOOM!');
end;

*** This one must work
Thread/core/processor 2
-----------------------
while true do begin
  Critical.Enter;
  if a<>b then Raise Exception.Create('KBOOM!');
  Critical.Leave;
end;

If the second one will not work in a n-code processor, or SMP, please
tell me why not. Of course the performance will be quite poor.

-- 
Best regards,
 José





More information about the Lazarus mailing list