Warten auf mehrere Zustandsvariablen in Boost?
Ich bin auf der Suche nach einem Weg, zu warten, bis mehrere Bedingungs-Variablen.
dh. so etwas wie:
boost::condition_variable cond1;
boost::condition_variable cond2;
void wait_for_data_to_process()
{
boost::unique_lock<boost::mutex> lock(mut);
wait_any(lock, cond1, cond2); //boost only provides cond1.wait(lock);
process_data();
}
Ist so etwas möglich mit condition Variablen. Und wenn nicht, gibt es alternative Lösungen?
Dank
InformationsquelleAutor der Frage | 2009-09-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass Sie alles tun können, wie dies mit boost::thread. Vielleicht, weil POSIX-bedingungsvariablen erlauben nicht diese Art von konstruieren. Natürlich hat Windows WaitForMultipleObjects aJ gebucht, die Lösung sein könnte, wenn Sie bereit sind, Schränken Sie Ihren code, um Windows synchronization primitives.
Eine weitere Möglichkeit wäre, weniger condition-Variablen: habe nur 1 condition variable, auf die Sie feuern, wenn etwas "Interessantes" passiert. Dann, jedes mal, wenn Sie warten wollen, führen Sie eine Schleife, die überprüft, um zu sehen, ob Ihre spezielle situation, der Interesse hat zu kommen, und wenn nicht, gehen Sie zurück zu, wartet auf die condition variable. Sie warten sollte, auf die Bedingung Variablen, die in einer solchen Schleife sowieso, als bedingungsvariable wartet, unterliegen spurious wakeups (von boost::thread docs, Hervorhebung von mir):
void wait(boost::unique_lock<boost::mutex>& lock)
...
Auswirkungen:
Atomar nennen
lock.unlock()
und blockiert den aktuellen thread. Der thread öffnest, wenn eine Mitteilung durch einen Anruf zuthis->notify_one()
oderthis->notify_all()
oder spuriously. ...InformationsquelleAutor der Antwort Managu
Als Managu schon beantwortet, Sie können die gleiche bedingungsvariable, und überprüfen Sie, ob mehrere "Ereignisse" (bool Variablen), die in Ihrer while-Schleife. Jedoch, der gleichzeitige Zugriff auf diese bool-Variablen müssen geschützt werden, mit den gleichen mutex, der condvar verwendet.
Schon seit ich ging durch die Mühe der Eingabe dieses code-Beispiel für eine Verwandte Frage, werde ich umbuchen es hier:
InformationsquelleAutor der Antwort Emile Cormier
Ich bin nicht sicher, ob der Boost-Bibliothek, aber Sie können WaitForMultipleObjects Funktion zu warten für mehrere kernel-Objekte. Überprüfen Sie einfach, ob das hilft.
InformationsquelleAutor der Antwort aJ.
Als Managu Punkte aus mit mehreren Bedingungen möglicherweise nicht eine gute Lösung in den ersten Platz. Was möchten Sie tun sollte möglich sein, realisiert durch den Einsatz von Semaphoren.
InformationsquelleAutor der Antwort count0
Unter Verwendung der gleichen Bedingung variable für mehrere Veranstaltungen technisch funktioniert, aber es funktioniert nicht erlauben die Kapselung. Also ich hatte den Versuch zu machen, eine Klasse, die es unterstützt. Noch nicht getestet! Es auch nicht unterstützen
notify_one()
als ich noch nicht so geklappt hat, wie zu implementieren.InformationsquelleAutor der Antwort Timmmm