5 Stimmen

C++ - Threads und mehrere Warteschlangen

Ich muss ein System von Arbeitern (repräsentiert als Threads) und (mehreren) Warteschlangen aufbauen. Individuelle Aufgaben warten in einer der Warteschlangen und warten darauf, von einem Arbeiter-Thread verarbeitet zu werden. Jeder Arbeiter kann Aufgaben nur aus einigen der Warteschlangen verarbeiten. Kein Dauerschleifen-Warten. C/C++, pthreads, Standard-POSIX.

Das Problem für mich ist die Sache mit den "mehreren Warteschlangen". Ich weiß, wie ich dies mit einer einzelnen Warteschlange implementieren kann. Die Arbeiter müssen auf allen Warteschlangen warten, die sie verarbeiten können (Warten auf BELIEBIGE von ihnen).

Auf Windows würde ich WaitForMultipleObjects verwenden, aber das muss plattformübergreifend sein.

Ich möchte keinen bestimmten Code dafür, nur einen Hinweis oder eine Beschreibung des Modells, das ich verwenden sollte. Danke im Voraus.

5voto

Wie wäre es mit:

  • alle Worker-Threads warten auf ein Semaphor
  • wenn etwas zur Warteschlange hinzugefügt wird, wird das Semaphor erhöht, was einen einzelnen Thread weckt
  • der Thread überprüft die für ihn interessanten Warteschlangen, bearbeitet eine davon und kehrt zum Warten auf das Semaphor zurück

Sie werden zusätzliche Mutexe benötigen, um tatsächliche Lese- und Schreibzugriffe auf die Warteschlangen zu steuern.

4voto

Adam Rosenfield Punkte 373807

Was Du tun kannst, ist eine Bedingungsvariable verwenden. Lass Deine Worker-Threads auf eine Bedingungsvariable warten. Wenn ein Job zu einer der Job-Warteschlangen hinzugefügt wird, signalisiere die Bedingungsvariable. Dann prüft der Worker-Thread, wenn er aufwacht, die Warteschlangen, auf die er wartet. Wenn eine davon einen Job hat, nimmt er diesen Job aus der Warteschlange. Andernfalls geht er zurück und wartet auf die Bedingungsvariable. Auf eine Bedingungsvariable zu warten, lässt den Thread schlafen, sodass er keine CPU-Zeit verbraucht.

Natürlich solltest Du alle Zugriffe auf die Job-Warteschlangen mit einem Mutex schützen (z.B. pthread_mutex_t).

0 Stimmen

Gute Idee, aber das wird alle Arbeiterthreads aufwecken, wenn ein Job zu einer leeren Warteschlange hinzugefügt wird. Ich nehme an, ich werde es trotzdem auf diese Weise tun, aber gibt es einen Weg, nur den "richtigen" Thread aufzuwecken (und idealerweise nur einen von allen richtigen Threads)?

0 Stimmen

Pthread_cond_signal() wird "mindestens einen" Thread wecken, der auf die Bedingungsvariable wartet, während pthread_cond_broadcast() alle Threads wecken wird. In der Theorie sollte pthread_cond_signal() die meiste Zeit nur einen Thread wecken, aber ich weiß nicht, ob das in der Praxis stimmt oder nicht.

0 Stimmen

Aber in Ihrer Lösung muss ich alle Threads aufwecken, weil ein Job möglicherweise in einer Warteschlange ist, die der eine Arbeiter nicht verarbeitet.

1voto

Dave Punkte 9913

Wenn es nicht zu viele Arbeiter für jede Warteschlange gibt, könnten Sie für jeden Arbeiter eine Bedingungsvariable erstellen.

0voto

Brian R. Bondy Punkte 325712

Klingt so, als ob Sie boost::thread, boost::condition und eine std::queue verwenden sollten.

0voto

PiNoYBoY82 Punkte 1568

Was ich tun würde, ist boost::asio zu verwenden, um Daten in einer Warteschlange zu platzieren, damit Ihre verschiedenen Threads darauf zugreifen können. Sie können eine Referenz zur Warteschlange über den Befehl "post" übergeben und den Thread entsprechend verarbeiten lassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X