C Threads, Wieso nur mit sleep?

Gast #3218279
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
Angehängte Dateien:
#3218466
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.
Gast #3218591
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...
Angehängte Dateien:

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