2016-05-04 8 views
0

Ich arbeite an etwas Code, der Leistung ist extrem anspruchsvoll (Ich verwende Mikrosekunden-Timer!). Die Sache ist, es hat einen Server < -> Client-Architektur, wo viele Daten mit hoher Geschwindigkeit geteilt werden. Um eine Synchronisation zwischen dem Client und dem Server zu erhalten, wird ein einfacher "Sequenznummer" -basierter Ansatz verfolgt. So kann der Client, wenn das Programm des Clients abstürzt, die Kommunikation "fortsetzen", indem er dem Server die letzte Sequenznummer sendet und sie "Operationen fortsetzen" kann, ohne etwas zu verpassen. Das Problem damit ist, dass ich Sequenznummern auf die Festplatte schreiben muss. Leider muss dies bei jeder "Transaktion" gemacht werden. Diese Datei schreibt große Zeitkosten (wie wir es erwarten). Also dachte ich, ich würde Threads verwenden, um dieses Problem zu umgehen. Wenn ich jedoch einen regulären Thread erstelle, müsste ich warten, bis der Datei-Schreibvorgang abgeschlossen ist und wenn ich einen gelöschten Thread verwende, mache ich etwas riskantes, da der Thread möglicherweise nicht beendet wird, wenn mein tatsächlicher Prozess beendet wird (sagen wir) und somit wird die Sequenznummer durcheinander gebracht.Wie schreibe ich eine teure Datei E/A in der Mitte eines C++ Programms

Was sind meine Optionen hier. Bitte beachten Sie, dass ich leider nicht auf C++ 11 zugreifen kann. Ich benutze lpthread unter Linux.

+1

Produzent/Verbraucher-Warteschlange. Der Hauptthread erzeugt Folgenummern, der Writer-Thread nimmt sie auf und schreibt sie auf die Festplatte. Stellen Sie sicher, dass am Ende des Programms der Consumer-Thread zum Stoppen signalisiert wird und dass er dem Haupt-Thread beigetreten ist. –

+0

Wenn ich Ihr Problem richtig verstanden habe, müssen Sie das Zeug auf der Festplatte spülen, so dass Sie nicht in der Warteschlange stehen können. Ich glaube nicht, dass es eine gute Möglichkeit gibt, das Problem mit der Geschwindigkeit der Festplatte mit gewöhnlicher Hardware zu umgehen, wenn Sie spülen müssen ... bessere Hardware ist eine Option oder [ram disk] (https://en.wikipedia.org/ wiki/RAM_drive) ist auch Kreuze in meinen Gedanken ... – user1810087

+1

Vermeiden [erfindet das Rad] (http://man7.org/linux/man-pages/man7/mq_overview.7.html), es ist in der Regel quadratisch. –

Antwort

1

Sie können die Daten einfach zu einer Warteschlange hinzufügen und die sekundären Threads aus der Warteschlange entfernen, schreiben und signalisieren, wenn sie fertig sind.

Sie können sich auch von logbasierten Dateisystemen inspirieren lassen. Sie umgehen dieses Problem, indem der Haupt-Thread zuerst einen kleinen Datensatz in eine Protokolldatei schreibt und die Kontrolle sofort an den Rest des Programms zurückgibt. In der Zwischenzeit können sekundäre Threads den eigentlichen Datenschreibvorgang ausführen und nach dem Schreiben signalisieren, dass sie auch in die Protokolldatei geschrieben werden. Dies hilft Ihnen, den Durchsatz aufrechtzuerhalten, indem Sie auf Schreibvorgänge verschieben, wenn mehr Systemressourcen verfügbar sind, und den Hauptthread nicht blockiert. Lesen Sie mehr darüber here