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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren