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