while(other_thread_is_busy); ohne die CPU zu belasten
-
Hi,
ich habe hier ein multithreaded Programm, in dem ein Thread recht oft auf einen anderen warten muss.
Und da einwhile(other_thread_is_busy);
sehr CPU-intensv ist, hatte ich das mit pthreads gelöst:pthread_mutex_lock(&other_thread_is_busy); // waits until the other thread is ready. pthread_mutex_unlock(&other_thread_is_busy);
Wie kann ich das nun ohne pthreads einigermaßen portabel umsetzen? Mit boost::thread geht es leider nicht.
thx im Voraus.
-
boost bietet joinable threads an. da machst du dann thread::join() und die fkt wartet bis der thread fertig ist
-
was auch bei der implementation mit pthreads die erste wahl gewesen wäre
dann wärste wahrscheinlich auch selbst drauf gekommen
-
So einfach ist das hier leider nicht. Beide Threads laufen quasi ewig, wobei Thread A ab und an ein paar Daten in einen Puffer schreibt und Threads B darauf wartet, um diese dann weiter verarbeiten.
-
ok. dann sind mutexes doch die bessere wahl, sorry
edit:
boost::mutex _mutex; boost::mutex::scoped_lock lock(_mutex);
?
edit 2:
oder oldschool#if defined(_WIN32) HANDLE Mutex = NULL; Mutex = CreateMutex(NULL, FALSE, NULL); #else pthread_mutex_t* Mutex = NULL; pthread_mutex_init(Mutex, NULL); #endif #if defined(_WIN32) WaitForSingleObject(Mutex, INFINITE); #else pthread_mutex_lock(Mutex); #endif #if defined(_WIN32) ReleaseMutex(Mutex); #else pthread_mutex_unlock(Mutex); #endif
-
Benutz eine andere Thread-Library:
http://openthreads.sourceforge.net/
http://zthread.sourceforge.net/
http://sourceware.org/pthreads-win32/
-
Äh.
"while (!condition) wait();" -> condition variable.
-
[quote="sothis_"]
#if defined(_WIN32) HANDLE Mutex = NULL; Mutex = CreateMutex(NULL, FALSE, NULL); #else ...
mutexe unter win sind zwar gut wenn man verschiedene prozesse synchronisieren will, für threads innerhalb eines prozesses sind nach der landläufigen meinung 'critical sections' besser geeignet (schneller).
-
hustbaer schrieb:
"while (!condition) wait();" -> condition variable.
Was hat jetzt man: wait(2) damit zu tun?
-
Earthy schrieb:
hustbaer schrieb:
"while (!condition) wait();" -> condition variable.
Was hat jetzt man: wait(2) damit zu tun?
Nichts. Was gleich die Frage aufwirft: was soll das sinnfreie Posting?
-
hustbaer schrieb:
Earthy schrieb:
hustbaer schrieb:
"while (!condition) wait();" -> condition variable.
Was hat jetzt man: wait(2) damit zu tun?
Nichts. Was gleich die Frage aufwirft: was soll das sinnfreie Posting?
Dasselbe könnte ich dich fragen, da wait() ja offenbar nichts mit meiner Frage zu tun hat.
BTW: Ich hab mich jetzt für den von sothis_ vorgeschlagenen oldschool-Weg entschieden, da es offenbar nichts besseres gibt.
-
Ok, du hast mich nicht verstanden.
"while (!condition) wait();" ist als pseude-code zu verstehen, und soll heissen: "solange bedingung X nicht zutrifft warten". Du hast im Kopfposting selbst "while(other_thread_is_busy);" geschrieben - was genau dasselbe ist.Also warten solange bis nichtmehr "other thread is busy". Und genau das macht man mit condition variablen.
Das ist die "beste Lösung".Ein Herumgemurkse mit Mutexen alleine wird dich nicht sehr weit bringen.
BTW: Ich hab mich jetzt für den von sothis_ vorgeschlagenen oldschool-Weg entschieden, da es offenbar nichts besseres gibt.
Tu was du meinst dass richtig ist. Dass es "nix besseres gibt" ist allerdings nicht wahr.
-
hustbaer schrieb:
Ok, du hast mich nicht verstanden.
"while (!condition) wait();" ist als pseude-code zu verstehen, und soll heissen: "solange bedingung X nicht zutrifft warten". Du hast im Kopfposting selbst "while(other_thread_is_busy);" geschrieben - was genau dasselbe ist.Achso. Jetzt verstehe ich, was du meinst. Ich war etwas verwirrt, da ich wait() aus einem anderen Kontext her kannte.
hustbaer schrieb:
Also warten solange bis nichtmehr "other thread is busy". Und genau das macht man mit condition variablen.
Das ist die "beste Lösung".Ich habe mal nach "condition variables" gegooglet und dies gefunden: http://www.cs.wustl.edu/~schmidt/win32-cv-1.html Das ist ganz interessant. Aber eine passende cross-platform Library wäre mir natürlich lieber, bevor ich mir selber etwa zusammen bastle. Kennst du da zufällig etwas?
hustbaer schrieb:
Ein Herumgemurkse mit Mutexen alleine wird dich nicht sehr weit bringen.
Naja, es hat ja mit den Mutexen wunderbar funktioniert, mich hatte halt nur gestört, dass es nicht portabel war und dass Mutexe eigentlich nicht dazu gedacht waren.
-
boost::thread hat condition variables:
http://www.boost.org/doc/html/boost/condition.html