[fpc-devel] SMP > 2 core Cache issue with Posix threads
    José Mejuto 
    joshyfun at gmail.com
       
    Fri Jul  1 19:48:23 CEST 2011
    
    
  
Hello FPC,
Friday, July 1, 2011, 6:44:44 PM, you wrote:
HPD> This scenario was reflected in my example (bi-linked list update).
HPD> The very last sentence deserves clarification. When not *all*
HPD> assignments are protected by a CS, the use of Interlocked assignments
HPD> only can improve cache coherence, but it IMO *can not* prevent (logical)
HPD> race conditions. IMO Andrew observed just such race conditions, 
HPD> resulting from a mix of sequential writes from multiple threads.
When not all assignements/reads are not protected by a CS (or similar)
there is not a problem of coherence, there is a logical problem. In
that case the use of interlocked operations only add overhead without
adding any kind of security/stability.
You can write lock free algorithms with interlocked operations, but
you can not write any other kind of procedures, usually more complex,
without a CS.
Tiny example:
Core/Thread 1:
--------------------
while true do begin
  Critical.Enter;
  a:=b;
  b:=b+1;
  if a=b then Raise Exception.Create('KBOOM!');
  Critical.Leave;
end;
Core/Thread 2:
-------------------
while true do begin
  InterlockedDecrement(b);
end;
This code will crash at a given time, maybe 1 millisecond, maybe 2
days, but it will crash.
Cache coherence is maintained by the hardware, interlocked only
provide atomicity. How the atomicity is provided is beyond the scope
of pascal and even the OS.
-- 
Best regards,
 José
    
    
More information about the fpc-devel
mailing list