Really, insofar as x86 is concerned, the only ones that are guaranteed to be atomic are, I think, the ordinal types, but that still leaves problems of code such as the following:

if GlobalCounter = 10 then
begin
  DoSomething;
  Break;
end else
  Inc(GlobalCounter);

If two threads are running a loop with the following code at the end, it could be that GlobalCounter is 9, the condition is checked, but before Inc(GlobalCounter) is called, the scheduler switches to the other thread, where GlobalCounter is checked and is still 9, and is then incremented, and only then does it switch back to the other thread, where Inc(GlobalCounter) is finally called, thereby setting GlobalCounter to 11 and breaking the program.

In this instance, a critical section or some other mutex is required, or the interlocked instructions, all of which incur a performance penalty.

Definitely something for a lot of discussion!

Gareth aka. Kit


On 02/07/2019 08:13, Benito van der Zander wrote:
Hi,

Am 28.06.19 um 11:24 schrieb George Bakhtadze:
If FPC somehow guarantees that a global field (even only of simple types) can be atomically read and written from any thread for ANY platform that is a very strong guarantee and worth mention in documentation.

 btw, how would you do that if it is in not guaranteed? especially on arm

Are there functions to do only an atomic reads and writes? (besides functions like interlockedincrement that do both, a read and write, together)

Best,
Benito

_______________________________________________
fpc-devel maillist  -  [email protected]
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus
_______________________________________________
fpc-devel maillist  -  [email protected]
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to