Beschränkung der Post-Queue-Größe mit Boost Asio?

9

Ich verwende boost::asio::io_service als Basis-Thread-Pool. Einige Threads werden zu io_service hinzugefügt, der Hauptthread beginnt Handler zu schreiben, die Worker-Threads starten die Handler und alles wird beendet. So weit, ist es gut; Ich bekomme eine schöne Beschleunigung über Singlethread-Code.

Der Hauptthread hat jedoch Millionen von Dingen zu posten. Und es schreibt sie einfach viel schneller, als die Worker-Threads damit umgehen können. Ich treffe RAM-Grenzen nicht, aber es ist immer noch dumm, so viele Dinge in die Warteschlange zu stellen. Ich möchte eine feste Größe für die Handler-Warteschlange und einen post () - Block haben, wenn die Warteschlange voll ist.

Ich sehe keine Optionen dafür in den Boost ASIO-Dokumenten. Ist das möglich?

    
Jon Stewart 26.07.2012, 22:46
quelle

4 Antworten

2

Ich verwende den Semaphor, um die Warteschlangengröße der Handler zu korrigieren. Der folgende Code veranschaulicht diese Lösung:

%Vor%     
Alexander Panin 19.08.2012 00:17
quelle
1

Sie können Ihr Lambda in ein anderes Lambda umbrechen, das die "laufenden" Aufgaben zählt, und dann vor der Buchung warten, wenn zu viele Aufgaben gerade ausgeführt werden.

Beispiel:

%Vor%

Ausgabe:

%Vor%     
rustyx 04.08.2016 15:42
quelle
0

Sie könnten das Strang-Objekt verwenden, um die Ereignisse zu setzen und eine Verzögerung in Ihrem Haupt-Objekt zu erzeugen? Fällt Ihr Programm aus, nachdem alle Arbeiten veröffentlicht wurden? Wenn ja, können Sie das Arbeitsobjekt verwenden, das Ihnen mehr Kontrolle darüber gibt, wann Ihr io_service aufhört.

Sie könnten immer den Zustand der Threads überprüfen und warten, bis einer frei wird oder so.

// Links

Ссылка

Ссылка

%Vor%

hoffe das hilft.

    
gda2004 27.07.2012 10:25
quelle
0

Versuchen Sie vielleicht, die Priorität des Hauptthreads zu verringern, damit die Hauptthreads nach dem Aktivieren der Worker-Threads den Hauptthread aushungern und das System selbst limitiert.

    
nate 04.08.2016 15:50
quelle

Tags und Links