Reenrante Funktion

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

ich hätte ein Problem, um das ich irgendwie nicht herum komme und da 
wollte ich euch um Rat bitten.


Also ich habe eine Funktion x, die durch mehrere Prozesse aufgerufen 
werden soll. Das Problem ist nur, dass diese Funktion x eine globale 
Variable verwendet (es gibt auch leider keine andere Möglichkeit :( ).

Meine Frage ist jetzt, ist es ok wenn ich eine Funktion schreibe die den 
Zugriff auf die Variable ermöglicht und diese dann in der Funktion x 
aufrufe, so in der Art:
1
int func_critical_section_read_access(void){
2

3
  pthread_mutex_lock(&mutex);
4

5
  int var_save = global_var;
6

7
  pthread_mutex_unlock(&mutex);
8

9
  return var_save;
10
}

oder muss ich die komplette kritische Funktion x durch Semaphoren 
schützen?

Ich hoffe ihr könnt mir da weiterhelfen.

Lg
Gast #5255111
Lesenswert?
• ▲
▼
Und dann nutzt du die Proto Threads?
OK... soll mir recht sein...


Solange ich nicht weiß, was die Funktion genau alles tut, kann ich nur 
den Rat geben, den Aufruf der gesamten Funktion zu verriegeln.
Gast #5255294
Lesenswert?
• ▲
▼
Johannes H. schrieb:
> oder muss ich die komplette kritische Funktion x durch Semaphoren
> schützen?

Niemand weiss was deine Funktion macht. Aber grundsätzlich musst du den 
Bereich schützen, in dem die Variable gelesen, verändert und wieder 
geschrieben wird, wie immer der aussieht. Also das was man als 
Read-Modify-Write bezeichnet. Das muss im Endeffekt ein atomarer Ablauf 
sein.

Natürlich kannst du die ganze Funktion schützen, da gibt es verschiedene 
Möglichkeiten, z.B. einfach Interrupts aus und wieder ein, aber das hat 
alles Nebenwirkungen, insbesondere muss die Zeit dafür so kurz wie 
möglich sein. Daher lohnt es sich, über den Ablauf der Funktion 
nachzudenken und nicht mehr zu sperren/schützen als unbedingt notwendig.

Georg
Gast #5255342
Lesenswert?
• ▲
▼
Erstmal halte ich es für eine dumme Idee, in einer Funktion eine globale 
Variable zu verändern.

Möglich aber dumm.

Besser wäre es, der Funktion einen Zeiger(C) oder eine Referenz(C++) auf 
die Variable zu übergeben.

Das befreit die Funktion von einer globalen Abhängigkeit.
Macht sie portabler und wiederverwendbarer.
Gast #5255351
Lesenswert?
• ▲
▼
Johannes H. schrieb:
> Also ich habe eine Funktion x, die durch mehrere Prozesse aufgerufen
> werden soll. Das Problem ist nur, dass diese Funktion x eine globale
> Variable verwendet (es gibt auch leider keine andere Möglichkeit :( ).

Eine globale Variable in mehreren Prozessen ist überhaupt kein Problem. 
Sie ist halt nur global pro Prozess.

Also, wenn man keine Ahnung hat, einfach ...
erstmal informieren was man eigentlich will. Und das dann auch 
beschreiben.

Wenn man einen Apfelkuchen backen will und feststellt, dass Äpfel ein 
Problem haben, ist es schwachsinnig zu fragen, warum Birnen angeblich 
das Problem der Äpfel haben, obwohl genau das Problem nur bei Äpfeln 
auftritt. Wirst du nicht verstehen, ist mir aber auch egal.
#5256077
Lesenswert?
• ▲
▼
@Johannes H.

Bist du dir ganz, ganz sicher dass du von mehrere Prozessen redest, die 
auf dieser Variablen zugreifen sollen?
Und nicht eher einfach mehrere Threads?

Und ausserdem, wie kommst du auf reentrante Funktionen?
Sowas hat man doch unter einem Nicht-Echtzeit-Betriebssystem wie Linux 
doch garnicht, oder?


Des weiteren da du schon ein OS einsetzst, gibt es bestimmte Gründe 
wieso du C nimmst?
In C++ gibt es für exakt dieses Problem, atomare Operationen.
Das vereinfacht auch den Code.
Gast #5256079
Lesenswert?
• ▲
▼
Alex G. schrieb:
> Und ausserdem, wie kommst du auf reentrante Funktionen?
> Sowas hat man doch unter einem Nicht-Echtzeit-Betriebssystem wie Linux
> doch garnicht, oder?

Du versucht mich zu verwirren!
Für mich ist der Begriff "reentrante Funktion" eindeutig.

Ob eine Funktion Wiedereintrittsfähig ist, hat nichts mit Echtzeit oder 
Linux zu tun.
#5256081
Lesenswert?
• ▲
▼
Arduino F. schrieb:
> Ob eine Funktion Wiedereintrittsfähig ist, hat nichts mit Echtzeit oder
> Linux zu tun.
Ja logisch, aber die Frage ist doch, wieso will der TE eine reentrante 
Funktion, wenn die Umstände das garnicht erfordern?
Er will eigentlich nur Thread-Sicherheit.

Eventuell sollte er sich das hier mal durchlesen: 
https://www.quora.com/When-is-a-function-reentrant-How-does-that-relate-to-it-being-thread-safe

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.