C: Variable im Hauptthread einmalig schreiben und von vielen Unter-Threads lesen?

  • Hallo,


    ich habe folgendes Vorhaben: In einem C-Programm (Threading mit pthreads) will ich direkt nach dem Programmstart eine Konfigurationsdatei einlesen. Die dort gelesenen Werte will ich einfach in einer globalen Variable halten.


    Später werden mehrere Unter-Threads gestartet, die auf die Konfigurations-Werte lesend zugreifen sollen. Nach dem Einlesen werden also keinerlei Änderungen mehr an den Variablen gemacht.


    Kann ich nun einfach so, ohne mich mit Locking zu beschäftigen, machen oder muss etwas beachtet werden?


    Danke im Voraus.

  • Moin,

    Kann ich nun einfach so, ohne mich mit Locking zu beschäftigen, machen oder muss etwas beachtet werden?


    solange es sich wirklich nur um einfache Variablen handeln sollte (also nicht in irgendwelchen Listen verwaltet, die dann zur Laufzeit geändert werden) und wirklich nur lesend zugegriffen wird (sobald der erste Thread läuft), kannst du auf Locks verzichten.


    Ciao Louis

  • Wenn eine normale C-Struktur als "einfache Variable" durchgeht, dann ist es eine solche.


    Das geht durch ;)

  • Alles geht, solange nichts dran verändert wird.
    Locking braucht man nur, um Lese- und Schreibzugriffe zu synchronisieren.


    Lars.

  • Eigentlich ein anderes Thema, aber ich füge es dennoch mal hier an.


    Solange alle Threads auf einer struct nur lesen gibt es, zumindest bisher, keine Probleme.


    Jetzt habe ich aber folgenden Fall:


    Es gibt zwei Threads, die normalerweise nichts voneinander wissen müssen. Der eine Thread empfängt von einem externen Gerät via libusb und der andere sendet. Zwei Kanäle, die eigentlich separat laufen.


    Jetzt kommt aber dazu, dass das externe Gerät mir einen Wert sendet (Batteriestatus) und dieser auf der Sendeseite eine Aktion auslösen soll (wenn Batterieladung unter X Prozent, dann eine LED blinken lassen).


    Im "Empfangs-Thread" den Ladezustand in ein "int" schreiben und im "Sende-Thread" dort saubere Werte zu erwarten ist jetzt wohl zu einfach. Was ist der einfachste Weg?


    Edit: Vielleicht ist der Multithread-Ansatz auch generell eine doofe Idee. Auch die "Empfangs-Seite" sendet. Weil auf USB ständig gepollt werden muss. Ein separater "Sende-Thread" blockiert also wohl ohnehin meinen "Empfangs-Thread". Ich werde mal schauen ob ich das alles in einen Thread bekomme.

  • Das mit dem int kannst du ruhig machen, im Zweifelsfall schützt du das Schreiben und Auslesen mit einer Mutex (die gleiche natürlich).


    Lars

  • Ich habe jetzt schon öfter gelesen, dass das mit einem einfachen "int" nicht geht (unvorhersehbares Verhalten). Zumindest einen theoretischen Fall kann ich mir so vorstellen, dass die 4 Bytes eines int nicht gleichzeitig geschrieben werden. Wenn ein zweiter Thread hier eine Mischung aus alten und neuen Bytes bekommt ist die Zahl halt Schrott.


    Bei mehreren Prozessen würde ich eine Pipe verwenden und da der "Sende-Thread" ohnehin blockierend von einem Device liest wäre das sogar garnicht so unvorteilhaft. Ich könnte dann von zwei offenen File-Descriptoren mit "poll" blockierend lesen. Möglicherweise ist das sogar der einfachste Weg.

  • Ja, wenn die Kommunikation sowieso nur in eine Richtung fließt, ist das auch ein Weg.
    Ich bin aber eher Fan von non-blocking I/O, da kann dein Thread einfach auf mehreren fd per select horchen und dann das tun, was gerade ansteht.


    Man muss sich aber irgendwann für die Lösung entscheiden, die einem selbst am besten liegt.


    Lars

  • "poll" und "select" sind aber, wenn ich das richtig verstanden habe, mehr oder weniger das gleiche, oder? Ich hatte beim Vergleichen nur den Eindruck, dass man mit "poll" das Ergebnis einfacher und logischer erreichen kann als mit "select".

  • Mit select kannst du gleichzeitig auf mehrere fd warten, falls dein Thread mehrere Kommunikationskanäle bedient (warten auf Empfang aus pipe, warten auf was zu schreiben beim Senden). So kann man I/O innerhalb eines Threads leichter mulriplexen, als wenn man der Reihe nach alle fd fragt, ob was zu tun ist.


    Ich müsste jetzt aber auch erst mal wieder manpages lesen, hab das nicht so im Kopf parat, ist zu lange her. :)


    Lars

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!