Threads - Sleep unterbrechen

guten Tag,

ich schreibe an einem Programm (in Ansi-C), welches per clone() einen Thread erzeugt und danach in einer Endlosschleife diverse Verwaltungsaufgaben übernimmt.
Der Thread liest an einer Pipe Eingaben und soll bei Bedarf gemeinsame Variablen mit Nachrichten für den Hauptthread füttern und diesen (falls er gerade sleep() ausführt) aufwecken.
Der Hauptthread guckt in regelmäßigen Abständen, ob in den gemeinsamen Variablen Nachrichten vorhanden sind.

Mein Problem: kann ich Hauptthread auch ohne kill aufwecken?
Es funktioniert zwar auch, ist aber keine schöne Lösung.

vielen Dank im Vorraus für die Hilfe.
Gruß, Hachi

Hossa :smile:

Du kannst den Thread auf ein bestimmtes Ereignis warten lassen. Er ruht dann so lange, bis das Ereignis eintritt. In der Windows-API gibt es dafür die Funktion „WaitForSingleObject“.

Viele Grüße

Hasenfuß

danke für deine Antwort.
Leider ist das Ereignis nur ein Spezialfall.
Normalerweise soll der Thread immer mit sleep() warten und dann weitermachen.
(Geht auch mit Ereignishandling ist aber keine schöne Lösung).

Wo du grade Windows-API sagst, sollte ich vllt dabei erwähnen, dass ich auf Linux arbeite :wink:

gruß, Hachi

Hossa :smile:

Du kannst ein sleep nicht unterbrechen. Normalerweise wird ein Thread vom Betriebssystem (egal ob Windows oder Linux) für ein bestimmtes Zeitfenster durchlaufen. Nach Ablauf des Zeitfensters wird dem Thread die Rechenzeit vom Betriebssystem wieder entzogen und der nächste Thread kommt dran. Mit sleep(0) teilst du dem Betriebssystem mit, dass du die noch verbliebene Rechenzeit aus dem Zeitfenster für einen Thread nicht mehr benötigst. Mit sleep(n) erzwingst du zusätzlich, dass der Therad für n Millisekunden vom Betriebssystem ignoriert wird. Das heißt nicht, dass der Thrad nach genau n Millisekunden wieder drankommt, sondern nur, dass er nach n Millisekunden vom Betriebssystem wieder in das Scheduling aufgenommen wird.

Wenn du also zeitkritische Anwendungen hast, kommst du um eine Signalverarbeitung mit Mutex, Semaphore, Signal oder sonst was nicht herum.

Viele Grüße

Hasenfuß

Howdy,

Du kannst ein sleep nicht unterbrechen.

ein richtiges sleep kann durch ein Signal unterbrochen werden (siehe hierzu unter Linux „man nanosleep“ und EINTR); das koennte man auch zu dem gewuenschten Zweck ausnutzen.

Gruss
norsemanna

danke für die Antworten.
Die man-page zu nanosleep sagt aber auch nichts anderes, als dass man den ausführenden Thread per Signal (zB durch kill) aufwecken kann.

Da es anscheinend keine andere Lösung gibt, werde ich dann wohl diese umsetzen,

hallo,

was spricht gegen den select-Befehl?

Gruß
achim

select einzubauen, würde das ganze zu unperfomant machen

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]