GuaAck hat folgendes geschrieben : |
Criticalsection bezieht sich ja darauf, das der Code nur von maximal einem Thread ausgeführt werden darf. ...
|
Eine Critcalsection setzt man häufig dafür ein, wenn auf Daten nicht durch mehrere Threads gleichzeitig zugegriffen werden darf.
Wärend dein Thread also neue Daten in den Puffer schreibt, muss der Hauptthread warten, bis der andere fertig ist.
Ebenso muss der Thread vor dem Hinzufügen neuer Daten warten, wenn der Hauptthread gerade die Daten aus dem Puffer abholt.
Z.B. muss eine Liste geschützt werden, damit nicht gleichzeitig Elemente hinzugefügt und entfernt werden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| type TMyDatenObject = class() Variable1: end; procedure TMyThread.AddItemToPuffer(AItem: TMyDatenObject); begin criticalsection.Enter; try FList.Add(AItem); finally criticalsection.Leave; end; end;
procedure TMyThread.GetItemFromPuffer: TMyDatenObject; begin criticalsection.Enter; try if FList.Count = 0 then Result := nil else begin Result := FList[0]; FList.Delete(0); end; finally criticalsection.Leave; end; end; |
Falls ein Thread sich gerade in einem Codeabschnitt zwischen Enter und Leave befindet und ein anderer Thread ebenfalls in einen Abschnitt der selben "criticalsection" eintreten will, muss er warten, auch wenn es sich um unterschiedliche Codeabschnitte handelt.