Forum: Mikrocontroller und Digitale Elektronik Unterschied zwischen Reentrant und Critical Section


von Johannes H. (Gast)


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

von jois3 (Gast)


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.

von Einer K. (Gast)


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.

von Georg (Gast)


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

von Eric B. (beric)


Lesenswert?

2x die gleiche Frage innerhalb von 20 minuten?

Beitrag "Unterschied zwischen Reentrant und Critical Section"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.