Frage

Ich versuche, einen multi-threaded, rekursive Dateisuchlogik in Visual C ++ zu implementieren. Die Logik ist wie folgt: Themen 1,2 werden in einer Verzeichnisposition starten und die Dateien in dem Verzeichnis mit den Suchkriterien vorhanden entsprechen. Wenn sie ein Kind Verzeichnis finden, werden sie es zu einer Arbeits Queue hinzufügen. Sobald ein Thread mit den Dateien in einem Verzeichnis beendet hat, packt es einen anderen Verzeichnispfad aus der Warteschlange. Der Arbeitsvorrat ist eine STL Stack-Klasse mit CriticalSections für push () bewacht, pop (), top () Anrufe.

Wenn der Stapel an einer beliebigen Stelle leer ist, werden die Fäden für eine Minute Menge an Zeit warten, bevor Neuer Versuch. Auch wenn alle Fäden in Wartezustand sind, wird die Suche als abgeschlossen markiert.

Diese Logik funktioniert ohne Probleme, aber ich fühle, dass ich bin immer nicht das volle Potenzial Threads verwenden, weil es keine drastischen Leistungssteigerung im Vergleich zu einzelnen Thread verwendet wird. Ich fühle mich die Arbeit Stapel der Flaschenhals ist, aber kann nicht herausfinden, wie man mit dem Verriegelungsteil zu beseitigen. Ich habe versucht, eine andere Variante, wo jeder Thread seine eigenen Stapel haben und wird ein Workitem an den globalen Stapel nur hinzufügen, wenn der lokale Stapelgröße eine feste Anzahl von Arbeitspositionen kreuzt. Wenn der lokale Stapel leer ist, wird Threads versuchen, von den globalen Warteschlange abgerufen werden. Ich fand nicht wahrnehmbaren Unterschied auch bei dieser Variante. Hat jemand irgendwelche Vorschläge für die Synchronisationslogik zu verbessern.

Grüße,

War es hilfreich?

Lösung

Ich bezweifle wirklich, dass Ihre Arbeit Stapel der Engpass ist. Die Scheibe hat nur einen Kopf, und kann nur einen Datenstrom zu einem Zeitpunkt lesen. Solange Ihre Threads die Daten verarbeiten, so schnell wie die Platte es liefern kann, gibt es nicht viel was Sie tun können, dass keine wesentlichen Auswirkungen auf die allgemeine Geschwindigkeit haben wird.

Für andere Arten von Aufgaben der Warteschlange könnte ein wesentlicher Engpass werden, aber für diese Aufgabe, ich bezweifle es. Halten Sie die Zeitskalen der Vorgänge hier im Auge behalten. Eine einfache Operation, die innerhalb einer CPU passiert, nimmt deutlich weniger als eine Nanosekunde. Ein Lese aus dem Hauptspeicher nimmt in der Größenordnung von zehn Nanosekunden. So etwas wie ein Thread-Wechsel oder Synchronisation erfolgt in der Größenordnung von ein paar hundert Nanosekunden oder so. Eine einzelne Kopfbewegung auf dem Plattenlaufwerk nimmt in der Größenordnung von einer Millisekunde oder so (1000000 ns).

Andere Tipps

Neben @ Jerry Antwort, Ihr Engpass ist das Plattensystem. Wenn Sie ein RAID-Array haben könnten Sie einige moderate Verbesserung von mit 2 oder 3 Fäden sehen.

Wenn Sie mehrere Laufwerke zu suchen haben (Anmerkung: physische Laufwerke, nicht Volumes auf einem einzigen physischen Laufwerk) Sie zusätzliche Threads für jeden von ihnen verwenden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top