Question

Je l'ai remarqué que boost.asio a beaucoup d'exemples impliquant des prises de courant, des ports série, et toutes sortes d'exemples non fichiers. Google n'a pas vraiment tourné un lot pour moi qui mentionne si ASIO est une bonne approche ou valable de le faire fichier asynchrone i / o.

J'ai paraison des données que je voudrais écrire sur le disque de manière asynchrone. Cela peut être fait avec io chevauché natif dans Windows (ma plate-forme), mais je préfère avoir une plate-forme solution indépendante.

Je suis curieux de savoir si

  1. boost.asio a tout type de support de fichier
  2. Prise en charge de fichier boost.asio est assez mature pour le fichier quotidien i / o
  3. déposerons un soutien jamais ajouter? Quelle est la perspective pour cela?
Était-ce utile?

La solution

A boost.asio tout type de support de fichier?

A partir de (je pense) Boost 1.36 (qui contient Asio 1.2.0) vous pouvez utiliser [boost :: asio ::] fenêtres :: stream_handle ou fenêtres :: random_access_handle pour envelopper une poignée et d'effectuer de lecture et d'écriture asynchrones méthodes à ce que la structure interne en utilisant OVERLAPPED.

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

est assez mature boost.asio support de fichiers pour le quotidien i / o?

Boost.Asio en elle-même est largement utilisé maintenant, et la mise en œuvre utilise IO en interne, je dirais oui chevauchée.

déposerons soutien jamais être ajouté? Quelle est la perspective pour cela?

Comme il n'y a pas de feuille de route se trouve sur le le site Web de Asio, je dirais qu'il n'y aura pas de nouveaux ajouts à Boost.Asio pour cette fonction. Bien qu'il y ait toujours la possibilité de contributeurs ajouter du code et des classes à Boost.Asio. Peut-être vous pouvez même apporter les pièces manquantes vous-même! : -)

Autres conseils

boost :: asio fichier i / o sur Linux

Sur Linux, utilise le mécanisme asio epoll pour détecter si un socket / fichier descripteur est prêt pour la lecture / écriture. Si vous essayez d'utiliser asio de vanille sur un fichier régulier sur Linux vous obtiendrez une exception « opération non autorisée » parce que epoll ne supporte pas les fichiers réguliers sur Linux .

La solution consiste à configurer asio pour utiliser le mécanisme select sur Linux. Vous pouvez le faire en définissant BOOST_ASIO_DISABLE_EPOLL. Le étant ici trade-off sélectionnez a tendance à être plus lent que epoll si vous re de travailler avec un grand nombre de sockets ouvertes. Ouvrez un fichier en utilisant régulièrement open() puis passer le descripteur de fichier à un boost::asio::posix::stream_descriptor .

boost :: asio fichier i / o sur Windows

Sous Windows, vous pouvez utiliser boost::asio::windows::object_handle pour envelopper un Handle qui a été créé à partir d'une opération de fichier. Voir exemple .

ASIO soutient E / S chevauchée sur Windows où le soutien est bon. Sur unix cette idée a stagné en raison de:

  • Les fichiers sont souvent situés sur le même dispositif physique, les accès en séquence est préférable.
  • Les demandes de dossier complet souvent très rapidement parce qu'ils sont physiquement Closeby.
  • Les fichiers sont souvent critiques pour terminer l'opération de base d'un programme (lire par exemple dans son fichier de configuration doit être effectuée avant d'initialiser plus)

La seule exception est commune au service des fichiers directement à des prises. Ceci est un cas spécial commun que Linux a une fonction du noyau qui gère pour vous. Encore une fois, annihilant la raison d'utiliser un fichier asynchrone E / S.

En bref:. ASIO semble refléter la philosophie de conception du système d'exploitation sous-jacente, CHEVAUCHENT E / S étant ignoré par la plupart des développeurs Unix, il est donc pas pris en charge sur cette plate-forme

boost :: asio :: :: windows random_access_handle est la meilleure façon de le faire, si vous avez besoin de pointe, par exemple LockFileEx asynchrone ou autre chose, vous pouvez étendre asio, ajoutez vos propres événements asynchrones. exemple

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

En fait, toutes les saveurs de fichier Async I / O suivre l'architecture "Fry Cook". Voilà ce que je veux dire dans le contexte d'une op Lire: I (fil de traitement) aller à un comptoir de restauration rapide (OS) et demander un cheeseburger (certaines données). Il me donne une copie de mon ticket de commande (une structure de données) et un ticket dans le dos de la cuisinière (le système de fichiers et du noyau) pour cuisiner mon hamburger. Je vais alors asseyez-vous ou lire mon téléphone (autres tâches). Plus tard, quelqu'un annonce que mon hamburger est prêt (un signal au fil de traitement) et je recueille ma nourriture (le tampon de lecture).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top