Zitat von
sirius:
So, wie es jetzt geschrieben ist, brauchst du keine CriticalSections. Die dauern viel zu lange. Hier kommt man mit den Interlockedxxxx- Funktionen weiter. Wenn du diese bei schreibenden Vorgängen benutzt, brauchst du bei lesenden Vorgängen keine Absicherung.
Wenn ich das jetzt richtig verstanden habe müsste es dann so aussehen:
Delphi-Quellcode:
procedure TRingBuffer.IncHead;
begin
InterlockedIncrement(FHead);
if FHead > 10 then
FHead := 0;
end;
Aber bin ich damit wirklich auf der sicheren Seite?
Folgendes Szenario: InterlockedIncrement wird ausgeführt. In diesem Moment kann die Variable nicht von anderen Threads gelesen werden. Angenommen der Wert von FHead sei vor dem inkrementieren 10 und danach folglich 11. Diesen 'Überlauf' fange ich zwar mit der folgenden if-Abfrage ab, aber was passiert wenn ein anderer Thread den Wert ausliest bevor diese geschehen ist? Dann hat er den Wert 11, sollte aber 0 haben