Pthread: sicherstellen cond_signal erst nach Aufruf cond_wait

P

philipp501

Grünschnabel
Hallo,
Gibt es eine Möglichkeit zu überprüfen, ob ein pthread_cond_wait aufgerufen wurde, damit man ein pthread_cond_signal nicht zu früh abgibt?

Code:
main
{
pthread_create(mein_thread);
pthread_mutex_lock(mutex);	//lock 1
...
pthread_cond_signal(mutex);
pthread_unlock(mutex);
...
}

mein_thread
{
	pthread_mutex_lock(mutex);	//lock 2
	pthread_cond_wait(mutex);
	...
	pthread_mutex_unlock;
}

In diesem Beispiel würde ein thread erzeugt und dann in beiden threads versucht den mutex zu locken.
Es sollte so sein, dass mein_thread auf jeden Fall als erster lockt, da sonst sein cond_wait nicht vor dem cond_signal aufgerufen wird. Kann man das irgendwie sicherstellen?

Ich hoffe es ist klar, was ich meine.

Danke schonmal
 
[...]
Gibt es eine Möglichkeit zu überprüfen, ob ein pthread_cond_wait aufgerufen wurde, damit man ein pthread_cond_signal nicht zu früh abgibt?
[...]

Sowas nennt man koordinationstechnisch ein "Rendezvous".
Dazu baust eine "barrier" b
aus einer posix wait condition w , einer mutex m als monitor,
einer mutex wm und einem counter c= 1..n
( n= Anzahl der rendezvous )

initial { c= 0; m.lock(), wm.lock() }

sobald Du die Barriere ausfuehren willst: b.wait();
sobald irgend(!)einer der Threads ein b.wait() ausfuehrt:
wird der monitor gelockt m.lock(),
c inkrementiert.
nun unterscheiden wir 2 Faelle:
Wenn c == n,
dann: w.broadcast()
sonst: m.unlock() und w.wait(m, optional_timeout_args);
danach: wm.lock() und m.unlock();

Voila, alle Threads sind synchron "at least for one glimpse"...

ref: http://opengroup.org/onlinepubs/007908799/xsh/pthread.h.html
 

Ähnliche Themen

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

Squid als RPCoHTTPS Proxy für Outlook Anywhere

fußballstatistik auswerten

probleme mit select()

iSight-Kamera&Ubuntu - Treiberprobleme auf MacBook Pro (Late 2006) (MA609LL)

Zurück
Oben