Einzelnen Beitrag anzeigen

Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#14

AW: TInterlocked.Exchange bei Zugriff eines nur lesenden Threads?

  Alt 17. Mär 2015, 12:39
Dann hat man auch einen Erfahrungswert und wird noch viel ruhiger
Erfahrungswerte sind bei Speichersemantik kritisch zu sehen. Fehler sind meisten ziemlich subtil, treten selten auf und sind schlecht reproduzierbar.
Es ist in 99% der Fälle besser die entsprechenden Bibliotheksfunktionen und Datentypen (richtig ausgerichtet) für atomare Zugriffe zu benutzen.

Und es nicht nur der Speicher selbst, auch der Compiler und Out-Of-Order-Execution kann dir reinpfuschen:
Delphi-Quellcode:
// Thread 1
ptr = Class.create():
ptr.value = 1337;
global_ptr = ptr;
Delphi-Quellcode:
// Thread 2
write(global_ptr.foo); // 1337?
Der Compiler weiß nicht, dass global_ptr von mehreren Threads benutzt wird und ordnet das wegen Optimierung so um (oder der Prozessor macht das; warum auch nicht):
Delphi-Quellcode:
// Thread 1
ptr = Class.create():
global_ptr = ptr;
ptr.value = 1337;
Den Fehler finde erst mal

Die Bibliotheksfunktionen sind entweder dem Compiler bekannt oder zumindest undurchsichtig, so dass er solche Spielchen lässt. Intern wird da sichergestellt, dass der Prozessor nichts umordnet (Memory Barriers oder andere Tricks).


Wenn es nur um Sachen geht, die schiefgehen können (z.B. Integer für Fortschrittsanzeige auslesen) mag das alles gut gehen. Alles darüber hinaus sollte man vorsichtig angehen.

Geändert von BUG (17. Mär 2015 um 12:43 Uhr)
  Mit Zitat antworten Zitat