Unterschied zwischen Reentrant und Critical Section

Gast #5210968
Lesenswert?
• ▲
▼
Hallo liebe Forenbesucher :)

Wie im Betreff schon erwähnt, handelt sich meine Frage über den 
Unterschied von Reentrant und Critical Section. Irgendwie habe ich da 
ein Denkfehler oder tu mir mit den Begriffen schwer.

Also man spricht von Critical Section (bessert mich bitte aus wenn ich 
falsch liege), wenn mehrere Tasks/Threads auf eine Shared Data zugreifen 
wollen, vor allem dann wenn ein Task lesen und einer schreiben will. 
(zum Beispiel Memory welches ich durch malloc erstellt habe). Hier kann 
es passieren, dass Dateninkonsistenz (Data race) entsteht.


Nicht-Reentrante Funktionen sind Funktionen oder librarys, welche 
globale oder statische Variablen besitzen (also alles was sich nicht am 
Stack befindet). Hier kann ebenso Dateninkonsistenz entstehen.

Bei beiden Fällen muss ich diese Kritischen Sektionen durch Mutex oder 
Semaphoren schützen.


Meine Frage ist jetzt: Betrifft der Begriff Reentrant nur Funktionen und 
Librarys oder kann ich zu einer Crtical Section auch sagen, dass diese 
Reentrant gemacht werden muss oder können nur librarys oder Funktionen 
reentrant sein?

Also mir geht vorallem um die Begrifflichkeiten und bitte bessert mich 
aus falls ich oben bei den Erklärungen fehler gemacht habe.

Lg Jooo
Gast #5210977
Lesenswert?
• ▲
▼
Hi Johannes,

just my 2 cent:
Ich sichere üblicherweise mit einer Critical Section (CS) ab, wenn es 
zwei Threads/Prozesse (*) gibt, die auf den gleichen Speicher zugreifen 
sollen. Gleichzeitig ist hier wichtig.

Reentrant lege ich Methoden/Funktionen aus, die im Verlauf der 
Abarbeitung in einem Thread mehrfach betreten werden können - warum auch 
immer das sein muss. Auch hier passieren Dinge irgendwie gleichzeitig, 
eine Absicherung z.B. auf Thread-Ebene (ein Thread hat das Token oder 
nicht) würde Dir hier aber nichts bringen, die zwei Läufe kämen sich 
immer noch in die Quere.

Das nur als Denk- und Recherchestart ;-)

Gruß, jois3

(*) Eine CS sichert zumindest im Begriffsbereich Windows/C/C++ nicht 
zwischen Prozessen ab, dafür gibt es den Mutex (teuer, aber 
Prozess-sicher). Ich hab mal etwas verallgemeinert, kommt aber auf den 
Kontext an.
Gast #5210989
Lesenswert?
• ▲
▼
Die beiden Begriffe haben nichts miteinander zu tun!

Eine Critical Section ist ein Bereich, wo kein anderer Prozess/Task/ISR 
rein pfuschen darf.


Reentrant heißt wiedereintrittsfähig.
Im Grunde bezeichnet es, die Fähigkeit einer Funktion, immer das gleiche 
zu tun. Egal unter welchen Umständen. Bei der Nutzung von Globalen oder 
statischen Variablen, kann es da (unerwünschte) Seiteneffekte geben.
Gast #5211021
Lesenswert?
• ▲
▼
Johannes H. schrieb:
> Betrifft der Begriff Reentrant nur Funktionen und
> Librarys oder kann ich zu einer Crtical Section auch sagen, dass diese
> Reentrant gemacht werden muss

Renetrant heisst, dass man den Code mehrfach und unsynchronisiert 
aufrufen kann. Eine Critical Section kannst du aber nicht aufrufen, es 
sei denn du verpackst sie eben in ein Unterprogramm. Also streng 
genommen nein.

Im übrigen haben die Dinge nur wenig miteinander zu tun: Reentrant ist 
Code, wenn bei jedem Aufruf eine andere Instanz von Variablen verwendet 
wird, z.B. auf dem Stack. Eine Critical Section braucht man dagegen 
gerade dann, wenn dieselbe Variable in verschiedenen Programmteilen 
verwendet wird, um Zugriffskonflikte zu vermeiden.

Es kann sein, dass eine reentrant Funktion eine Critical Section haben 
muss, z.B. wenn das Ergebnis von a+b immer im Akkumulator landet, den es 
im Prozessor nur einmal gibt.

Georg

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.