On 06/27/2011 03:31 PM, Andrew Brunner wrote:
Simply protecting a loop with a futex is not sufficient.  Assigning
variables in a multi-threaded environment is not sufficient.
While I don't think we should this discuss in this context, I suggest that in the docs for the user of the object library (that was the starting point of the discussion), any type of thread-safety should include threads running on multiple processors.
Interlocked/Exchange/ExchangeAdd/Increment features must be used
whenever dealing with variables (with at least one exception)  In my
experience arrays of boolean are atomic.
Yep. But this is only relevant if you don't protect them by a critical section, as this excludes concurrent exchange before the critical instructions are executed. Of course (when possible) using the interlocked instruction results in a lot less overhead than simply using a critical section.
I ran tests on a HexCore AMD system which had unexplained anomalies
with pointers in an bidirectional linked list.  I replaced all the
pointer assignments with InterlockedExchange and the system worked
flawlessly.
This is clear. You also would have been able to avoid the problem by using critical sections around *all *the appropriate instructions, but supposedly this would have slowed done the application greatly.
  Some of the assignments were taking place in a
criticalsection (btw).
I believe that the "some" were not enough.

-Michael
--
_______________________________________________
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to