Andrew Brunner schrieb:

In a bidirectionally linked list up to 4 pointers have to be updated
together, whenever an element is inserted or removed. This leaves much room
for race conditions, that cannot be cured by protecting every single
pointer. Instead the entire chain must be protected, by a MUTEX or other
synchronization means. And then it's only a *convention*, which object or
memory block shall be protected by a MUTEX, no memory barrier prevents
access without obtaining the MUTEX first. Kind of a memory barrier can be
established by putting the list object (head) into a TThreadList, *provided
that* no code will retain references to list elements after releasing the
list object.

I had a similar issue once.

Above is my comment on your example ;-)

IMO a nice candidate for a thread-safety tutorial. It even can be extended into a less restrictive model, that allows for kind of multiple-read-exclusive-write access.

 And it was solved with bringing the list
under my manager/worker system so that there was only one thread
accessing the linkedlist, and I used InterlockedExchange for
First,Last,Next,Previous.

Why do you see a need for Interlocked updates, when only one thread can access the list at the same time?

IMO Interlocked updates are fine for self-contained values, where the use of critical sections would be overkill. But when multiple variables have to be updated without interruption (synchronously, atomically), the entire data object should be protected against concurrent access.


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.)

It's not a matter of the language, when a thread does *not* aquire a lock
before accessing the related resource. It's simply a design flaw, when some
piece of code does not obey the established rules.

I don't see how this is an issue of obedience.  It's more of a phenomenon.

I see it as a matter of coding discipline, and how to make disobedience as impossible as possible ;-)

DoDi


--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to