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
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.