Frage

Ich habe bemerkt, dass Boost.Asio viele Beispiele verfügt über Anschlüsse, serielle Anschlüsse und alle Arten von Nicht-Datei Beispiele beteiligt sind. Google hat mich nicht wirklich viel für mich, dass erwähnt, wenn Asio zu tun asynchrone Datei ein guter oder ein gültiger Ansatz ist i / o.

Ich habe Gobs von Daten habe ich asynchron auf Platte schreiben möchten. Dies kann mit nativer überlappen io in Windows (meine Plattform) durchgeführt werden, aber ich würde es vorziehen, eine plattformunabhängige Lösung zu haben.

Ich bin gespannt, ob

  1. Boost.Asio hat jede Art von Datei-Unterstützung
  2. Boost.Asio Datei-Unterstützung ist reif genug für die tägliche Datei i / o
  3. Wird Unterstützung jemals hinzugefügt Datei? Was die Aussichten für das?
War es hilfreich?

Lösung

Hat Boost.Asio jede Art von Datei-Unterstützung?

Beginnend mit (glaube ich) Erhöhung 1,36 (enthält Asio 1.2.0) Sie können [boost :: asio ::] Fenster :: stream_handle oder Fenster :: random_access_handle einen Griff zu wickeln und asynchrone Lese- und Write-Methoden darauf, dass die Verwendung der überlappte Struktur intern.

User Lazin erwähnt auch boost :: asio :: Fenster :: random_access_handle, die für Asynchron-Operationen verwendet werden können (z Named Pipes, sondern auch Dateien).

Ist Boost.Asio Dateiunterstützung reif genug für die tägliche Datei i / o?

Wie Boost.Asio an sich mittlerweile allgemein verwendet wird, und die Implementierung verwendet intern überlappende IO, würde ich sagen ja.

Wird Unterstützung je hinzugefügt Datei? Was die Aussichten für das?

Da gibt es keinen Fahrplan für die Asio Website, würde ich sagen, dass es keine neue Ergänzungen zu Boost.Asio für diese Funktion. Zwar gibt es immer die Möglichkeit der Beitragszahler Hinzufügen von Code und Klassen zu Boost.Asio. Vielleicht können Sie sogar die fehlenden Teile selbst tragen! : -)

Andere Tipps

boost :: asio Datei i / o auf Linux

Unter Linux Asio verwendet den epoll Mechanismus, wenn eine Steckdose / Datei zu erkennen Descriptor ist zum Lesen / Schreiben bereit. Wenn Sie Vanille Asio auf einer regulären Datei unter Linux zu verwenden versuchen, werden Sie eine „Operation nicht erlaubt“ Ausnahme, weil epoll nicht reguläre Dateien auf Linux unterstützt.

Die Abhilfe ist Asio zu konfigurieren, dass die select Mechanismus auf Linux. Sie können dies tun, indem BOOST_ASIO_DISABLE_EPOLL definieren. Die Trade-off hier zu sein wählen neigt dazu, langsamer zu sein als epoll , wenn Sie‘ re mit einer großen Anzahl von offenen Sockets arbeiten. Öffnen Sie eine Datei regelmäßig open() verwenden und dann übergeben Sie den Dateideskriptor zu einer boost::asio::posix::stream_descriptor .

boost :: asio Datei i / o unter Windows

Unter Windows können Sie verwenden boost::asio::windows::object_handle eine Handle einzuwickeln, die aus einer Dateioperation erstellt wurde. Siehe Beispiel .

ASIO unterstützt überlappende I / O auf Windows, wo die Unterstützung gut. Auf Unix-Varianten hat diese Idee stagniert wegen:

  • Dateien oft auf dem gleichen physischen Gerät angeordnet sind, bevorzugt, sie sequentiell zugreift.
  • Datei-Anfragen vervollständigen oft sehr schnell, weil sie körperlich closeby sind.
  • Dateien sind oft entscheidend für den grundlegenden Betrieb eines Programms abgeschlossen (beispielsweise in der Konfigurationsdatei lesen muss, bevor die Initialisierung weiter durchgeführt werden)

Die eine gemeinsame Ausnahme-Dateien direkt an die Buchsen dienen. Dies ist eine solche gemeinsame Sonder Fall, dass Linux hat eine Kernfunktion , die dies für Sie übernimmt. Auch die Verwendung der asynchrone Datei-I / O, um den Grund zu negieren.

. Kurz: ASIO erscheint die zugrunde liegende Betriebssystem Design-Philosophie zu reflektieren, überlappte / I O von den meisten Unix-Entwickler ignoriert werden, so dass es nicht auf dieser Plattform unterstützt

boost :: asio :: Fenster :: random_access_handle ist der einfachste Weg, dies zu tun, wenn Sie etwas erweiterte benötigen, beispielsweise asynchrone LockFileEx oder etwas anderes, könnte man Asio erweitern, Ihre eigene asynchrone Ereignisse hinzuzufügen. Beispiel

Linux hat eine Asio-Bibliothek, die keine härter für diesen Job als Windows-APIs zu verwenden ist (ich habe es verwendet wird). Beide Sätze von Betriebssystemen implementieren die gleiche konzeptionelle Architektur. Sie unterscheiden sich in Details, die eine gute Bibliothek, um das Schreiben relevant sind, aber nicht zu dem Punkt, dass Sie nicht eine gemeinsame Schnittstelle für beide OS-Plattformen haben kann (ich habe eine verwendet wird).

Grundsätzlich sind alle Varianten von Async Datei-I / O, um die "Fry Kochs" Architektur folgen. Hier ist, was ich im Rahmen einer Lese op bedeuten: I (Verarbeitungs-Thread) gehen bis zu einem Fast-Food-Zählern (OS) und fragen Sie nach einem Cheeseburger (einige Daten). Es gibt mir eine Kopie meiner Bestellung Ticket (einige Datenstruktur) und gibt ein Ticket in den Rücken an den Koch (die Kernel-Dateisystem) mein Burger zu kochen. Ich gehe dann hinsetzen oder mein Handy lesen (andere Arbeit tun). Später kündigt jemand, dass mein Burger bereit ist (ein Signal an den Verarbeitungs-Thread) und sammle ich mein Essen (der Lesepuffer).

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