Forum: PC-Programmierung C Threads, Wieso nur mit sleep?


von fex (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
ich versuche mich gerade an Threads und habe ein eigentlich einfaches 
Programm geschrieben, welches zwei Threads erzeugt, einer schreibt 10 
Werte in ein Array, der andere ließt sie aus. Geschützt wird mit Mutexes 
und "zwischen schreiben und lesen umgeschaltet" wird mit Conditions.
Das ganze funktioniert soweit auch, aber nur, wenn ich in Zeile 81 das 
sleep(1) drin lasse, sonst nicht. Hat jemand eine Idee, wieso?

Lg fex

von Andreas B. (andreas_b77)


Lesenswert?

Aus der man-Page:

> pthread_cond_signal restarts one of the threads that are waiting on the
> condition variable cond. If no threads are waiting on cond, nothing
> happens. If several threads are waiting on cond, exactly one is restarted,
> but it is not specified which.

Ohne das sleep() wirst du das pthread_cond_signal() ausführen, bevor der 
"schreiben" Thread zur Ausführung kommt und auf die Condition Variable 
warten kann. Und dann passiert nichts.

von Der Lolf (Gast)


Angehängte Dateien:

Lesenswert?

mein debian-linux hat immernoch ein timing-problem mit Deinem Programm. 
Manchmal läuft es ganz durch aber häufig so:
1
./a.out
2
pause_read 
3
pause_write 
4
MAIN: thread creation done, sending signal: schreiben_moeglich
5
run_write 
6
sending signal: lesen_moeglich
7
run_read 
8
  1   2   3   4   5   6   7   8   9  10 sending signal: schreiben_moeglich
9
pause_write 
10
11
pause_read
(mein debug-code im Anhang)

Man sieht das das signal schreiben_moeglich kommt noch bevor es bei 
pause_write in die pthread_cond_wait Wartefunktion springt, die das 
somit nicht empfängt, weil das signal zu früh kommt bzw. weil es zu dem 
Zeitpunkt noch keinen schlafenden thread gibt, den man wecken könnte...

ich kenn mich mit pthreads nicht aus, weis also keine Lösung außer 
globale Variablen, die irgendwie vorher prüfen ob ein thread pennt 
oderso, aber das ist wohl eher nicht im Sinne von pthreads außerdem 
könnte ja das signal kommen genau in dem moment, wo ich die variable 
"thread pennt" gesetzt habe aber noch nen millisekundentick bevor der im 
nächsten Schritt wirklich in das wait gesprungen ist...

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.