2010-12-31 30 views
4

Ich habe einen Thread-Pool in C++ erstellt, die alle Aufgaben in einer Warteschlange speichert. Thread-Pool-Start n Anzahl der Threads, die Aufgaben aus der Warteschlange übernehmen, jede Aufgabe verarbeiten und anschließend Aufgaben aus der Warteschlange löschen.Warten auf Aufgaben in Threadpool abgeschlossen werden

Jetzt möchte ich warten, bis alle Aufgaben abgeschlossen sind. Die Überprüfung auf eine leere Warteschlange für die Ausführung von Aufgaben funktioniert möglicherweise nicht, da jedem Thread eine Aufgabe erteilt werden kann und die Warteschlange geleert werden kann, aber die Aufgaben sich noch im Verarbeitungsmodus befinden können.

Ich bekomme keine Ahnung, wie man auf die Fertigstellung der Aufgaben wartet. Das ist ein Designproblem. Irgendwelche Vorschläge?

Antwort

4

Müssen Sie warten, bis alle Threads beendet sind, oder müssen Sie nur noch überprüfen?

Wenn Sie nur überprüfen müssen, können Sie eine Variable haben, die die Anzahl der aktuell ausgeführten Aufgaben speichert, und InterlockedIncrement es am Anfang eines Threads, dann InterlockedDecrement es am Ende.

Wenn Sie warten müssen, und Sie eine kleine Anzahl von Threads haben, kann jeder Thread seine eigene manuelle Reset-Ereignis haben, dass Sie ResetEvent wenn der Thread beginnt und SetEvent, wenn es beendet ist. Dann nur WaitForMultipleObjects für alle Veranstaltungen.

+0

Danke, mit InterLock Funktionen löste mein Problem. – anand

1

Verwenden Sie eine Sentinal-Task, die den Verarbeitungsthread zum Beenden anweist. Setzen Sie eine dieser Aufgaben in die Warteschlange. Dann schließe dich deinem Thread-Pool an.

Sie können dies natürlich so ändern, dass Sie anstatt exit/join für die Synchronisation zu verwenden, etwas tun können, das den Pool am Leben erhält. Zum Beispiel kann jeder Thread auf irgendeine Art von bedingter Variable oder Barriere oder Zähl-Semaphor synchronisieren, wenn er eine sentinale Aufgabe aus der Warteschlange nimmt.

Verwandte Themen