ich hab hier ein Quelltextbeispiel, welches einen Spinlock darstellt, welcher optimiert ist für ständiges schnelles lesen und seltenes schreiben ab und an.
Auf einer Single CPU funktioniert das wunderbar. Auf einem Quad XEON zum testen schlägt die Synchronization manchmal fehl. (Allerdings wesentlich seltener als völlig unsynchroniziert. Man sieht das am besten im angehangenen Beispiel.
Auch nach längerem draufschauen auf den Code, ist mir keine Lösung eingefallen, weiß jemand Rat? vielen Dank!
Delphi-Quellcode:
//==============================================================================
procedure XMspinLock.BeginRead;
begin
while(FCountWR>0)
do Sleep(1);
InterlockedIncrement(FCountRD);
end;
//==============================================================================
procedure XMspinLock.EndRead;
begin
if(InterlockedDecrement(FCountRD)<0)
then
raise Exception.Create('
Negative read InterlockedDecrement count');
end;
//==============================================================================
procedure XMspinLock.BeginWrite;
var
wrcnt : integer;
begin
wrcnt:=InterlockedIncrement(FCountWR);
while(FCountRD > 0)
do Sleep(1);
while(FCountWR > wrcnt)
do Sleep(1);
end;
//==============================================================================
procedure XMspinLock.EndWrite;
begin
if(InterlockedDecrement(FCountWR)<0)
then
raise Exception.Create('
Negative write InterlockedDecrement count');
Sleep(0);
end;
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.