53 votes

Quel est le problème avec boost.asio et file i / o?

J'ai remarqué que boost.asio a beaucoup d'exemples impliquant des sockets, des ports série, et toutes sortes de non-exemples de fichier. Google n'a pas vraiment tourné beaucoup pour moi qui mentionne si asio est une bonne ou une approche valable pour faire asynchrone e/s de fichier.

J'ai des masses de données que je voudrais écrire sur le disque de manière asynchrone. Cela peut être fait avec les indigènes se chevauchent io dans Windows (mon programme), mais je préfère avoir une plate-forme indépendante de la solution.

Je suis curieux de savoir si

  1. coup de pouce.asio a toute sorte de fichier de soutien
  2. coup de pouce.asio prise en charge des fichiers est assez mature pour tous les jours fichier i/o
  3. Sera prise en charge des fichiers jamais être ajouté? Quel est le outlook pour cela?

20voto

vividos Points 1933

A coup de boost.asio tout type de fichier de soutien?

Départ avec (je pense) Stimuler 1.36 (qui contient Asio 1.2.0), vous pouvez utiliser [boost::asio::]windows::stream_handle ou windows::random_access_handle pour l'envelopper d'une POIGNÉE et d'effectuer asynchrone de lire et d'écrire des méthodes qui utilisent la structure OVERLAPPED en interne.

L'utilisateur Lazin mentionne également les boost::asio::windows::random_access_handle qui peuvent être utilisés pour des opérations asynchrones (par exemple, les canaux nommés, mais aussi les fichiers).

Est coup de pouce.asio prise en charge des fichiers de maturité suffisant pour tous les jours fichier i/o?

Comme Boost.Asio en lui-même est largement utilisé par les maintenant, et la mise en œuvre utilise des e / s recouvrables en interne, je dirais que oui.

Sera prise en charge des fichiers jamais être ajouté? Quel est le outlook pour cela?

Comme il n'y a pas de feuille de route trouvés sur le Asio site, je dirais qu'il n'y aura pas de nouveaux ajouts à Boost.Asio pour cette fonction. Bien qu'il y a toujours la possibilité de contributeurs ajout de code et catégories de Boost.Asio. Peut-être que vous pouvez même contribuer à les parties manquantes de vous-même! :-)

5voto

Lazin Points 4481

boost :: asio :: windows :: random_access_handle est le moyen le plus simple de le faire. Si vous avez besoin de quelque chose de avancé, par exemple, LockFileEx asynchrone ou autre, vous pouvez étendre asio, ajouter vos propres événements asynchrones. exemple

4voto

unixman83 Points 2669

ASIO prend en charge overlapped I/O sur Windows où le support est bon. Sur les systèmes Unix, cette idée a stagné en raison de:

  • Les fichiers sont souvent situés sur le même dispositif physique, d'accéder de manière séquentielle est préférable.
  • Les demandes de fichiers souvent complet très rapidement parce qu'ils sont physiquement très proches.
  • Les fichiers sont souvent indispensables pour compléter le fonctionnement de base d'un programme (par exemple en lisant dans son fichier de configuration doit être fait avant l'initialisation de plus)

La commune exception est de servir des fichiers directement sur les sockets. C'est une commune spécial que Linux a une fonction noyau qui gère cela pour vous. De nouveau, la négation de la raison de l'utilisation de fichier asynchrone I/O.

En Bref: ASIO semble refléter l'OS sous-jacent de la philosophie de design, overlapped I/O d'être ignoré par la plupart des développeurs Unix, de sorte qu'il n'est pas pris en charge sur cette plateforme.

0voto

Zack Yezek Points 134

Linux a un pilote asio de la Bibliothèque qui n'est pas plus difficile à utiliser que Windows Api pour ce travail (je l'ai utilisé). Les deux ensembles de systèmes d'exploitation à mettre en œuvre la même architecture conceptuelle. Ils diffèrent dans les détails qui sont pertinentes à l'écriture d'une bonne bibliothèque, mais pas au point que vous ne pouvez pas avoir une interface commune pour les deux plates-formes d'OS (j'ai utilisé un).

Fondamentalement, toutes les saveurs de la Async Fichier I/O suivre les "Frire Cuire" de l'architecture. Voici ce que je veux dire dans le contexte d'une Lecture op: je (thread de traitement) aller jusqu'à un comptoir de restauration rapide (OS) et de demander un cheeseburger (certaines données). Il me donne une copie de ma commande de billets (certaines données de la structure) et émet un billet à l'arrière de la cuisinière (le Kernel & système de fichiers) à faire cuire mon burger. J'ai ensuite aller s'asseoir ou de lire mon téléphone (à faire d'autres travaux). Plus tard, quelqu'un annonce que mon burger est prêt (un signal pour le thread de traitement) et je collectionne à ma cuisine (le tampon de lecture).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X