Forum: Mikrocontroller und Digitale Elektronik Reenrante Funktion


von Johannes H. (Gast)


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

von OliverB (Gast)


Lesenswert?

Du meinst "reenrantes Posting", oder?

von Johannes H. (Gast)


Lesenswert?

uppss ja genau

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

OliverB schrieb:
> Du meinst "reenrantes Posting", oder?
Erledigt.

Johannes H. schrieb:
> ich hätte ein Problem
Mich würde die Prozessorarchitektur interessieren. Und das verwendete 
Betriebssystem.

von Johannes H. (Gast)


Lesenswert?

Also es soll auf dem Rasperry Pi laufen, als Betriebssystem verwende ich 
Jessie.

von Einer K. (Gast)


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.

von Carl D. (jcw2)


Lesenswert?

Arduino F. schrieb:
> Und dann nutzt du die Proto Threads?
> OK... soll mir recht sein...

p wie Posix, also Posix Threads!

Merke: es gibt mehr als AVR!

;-))

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Carl D. schrieb:
> p wie Posix, also Posix Threads!
Soll mir auch recht sein....

von Max M. (jens2001)


Lesenswert?

> Reenrante Funktion

> "reenrantes Posting"

OMG!

von georg (Gast)


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

von Einer K. (Gast)


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.

von Linus (Gast)


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.

von Peter D. (peda)


Lesenswert?

Johannes H. schrieb:
> Das Problem ist nur, dass diese Funktion x eine globale
> Variable verwendet (es gibt auch leider keine andere Möglichkeit :( ).

Schön für Dich.
Nur können wir nicht hellsehen, welchen Einfluß diese ominöse Variable 
hat.
Global muß sie nur dann sein, wenn noch ein anderer Task darauf 
zugreifen soll.

von Stefan F. (Gast)


Lesenswert?

Deine Funktion dem Lock ist nicht Reentrant. Sie kann zwar von mehrere 
Threads nacheinander aufgerufen werden, aber sie kann nicht durch einen 
Interrupt unterbrochen und erneut aufgerufen werden.

https://de.wikipedia.org/wiki/Eintrittsinvarianz

von Alex G. (dragongamer)


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.

von batman (Gast)


Lesenswert?

Äh?!

von Einer K. (Gast)


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.

von Alex G. (dragongamer)


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

: Bearbeitet durch User
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.