Pregunta

Me he dado cuenta de que boost.asio tiene una gran cantidad de ejemplos que implican tomas de corriente, puertos serie, y todo tipo de ejemplos que no son ficheros. Google realmente no ha aparecido mucho para mí que menciona si asio es un enfoque bien o válida para hacer archivo de E / S asíncrona.

Tengo montones de datos que me gustaría escribir en el disco de forma asíncrona. Esto se puede hacer con io solapada nativa en Windows (mi plataforma), pero preferiría tener una solución independiente de la plataforma.

Tengo curiosidad por si

  1. boost.asio tiene cualquier tipo de soporte de archivos
  2. Soporte de archivos boost.asio es lo suficientemente maduro para el archivo de todos los días de E / S
  3. Se presentar un apoyo cada vez que añadir? ¿Cuál es la perspectiva para esto?
¿Fue útil?

Solución

¿Ha boost.asio cualquier tipo de soporte de archivos?

A partir de (creo) Boost 1.36 (que contiene Asio 1.2.0) se puede utilizar [impulso :: :: asio] ventanas o ventanas stream_handle :: :: random_access_handle para envolver un mango y realizar lectura asíncrona y escribir métodos en él que se utilice la estructura OVERLAPPED internamente.

El usuario Lazin también menciona impulso :: asio :: Windows :: random_access_handle que se pueden utilizar para las operaciones asíncronas (por ejemplo, tuberías con nombre, sino también archivos).

¿Es boost.asio soporte de archivos lo suficientemente maduro para el archivo de todos los días E / S?

Como Boost.Asio en sí mismo es ampliamente utilizado por ahora, y la aplicación utiliza solapada IO internamente, yo diría que sí.

archivará el apoyo de que se añadieran? ¿Cuál es la perspectiva para esto?

Como no hay hoja de ruta se encuentra en la página web Asio , yo diría que no habrá nuevas incorporaciones Boost.Asio para esta función. Aunque siempre existe la posibilidad de añadir contribuyentes de código y clases de Boost.Asio. Tal vez usted puede incluso contribuir las partes que faltan a ti mismo! : -)

Otros consejos

impulso :: asio archivo de E / S en Linux

En Linux, asio utiliza el mecanismo epoll para detectar si un enchufe / archivo descriptor está listo para la lectura / escritura. Si intenta utilizar asio de vainilla en un archivo normal en Linux obtendrá una "operación no permitida" excepción porque epoll no soporta archivos normales en Linux .

La solución consiste en configurar asio utilizar el href="http://linux.die.net/man/2/select" rel="nofollow noreferrer"> select mecanismo en Linux. Usted puede hacer esto mediante la definición de BOOST_ASIO_DISABLE_EPOLL. La desventaja aquí es seleccione tiende a ser más lento que epoll si' volver a trabajar con un gran número de sockets abiertos. Abrir un archivo con regularidad open() y luego pasar el descriptor de archivo a un boost::asio::posix::stream_descriptor .

impulso :: asio archivo de E / S en Windows

En Windows, puede utilizar boost::asio::windows::object_handle para envolver un Handle que fue creado a partir de una operación de archivo. Ver ejemplo .

ASIO compatible superpuesto E / S en Windows, donde el apoyo es bueno. En Unix esta idea se ha estancado debido a:

  • Archivos a menudo se encuentran en el mismo dispositivo físico, acceder a ellos de forma secuencial es preferible.
  • solicitudes de archivos a menudo terminan muy rápidamente porque son físicamente cerca.
  • Los archivos son a menudo críticos para completar la operación básica de un programa (por ejemplo, en la lectura de su archivo de configuración que se debe hacer antes de inicializar más)

La única excepción común está sirviendo archivos directamente a enchufes. Este es un caso especial tan común que Linux tiene un función del núcleo que se encarga de esto para usted. Una vez más, negando la razón para usar asíncrono archivo de E / S.

En breve:. ASIO parece reflejar la filosofía de diseño del sistema operativo subyacente, E / S superpuesta siendo ignorado por la mayoría de los desarrolladores de Unix, por lo que no es compatible con esa plataforma

boost :: asio :: Windows :: random_access_handle es la forma más fácil de hacer esto, si necesita algo avanzado, por ejemplo LockFileEx asíncrono o algo más, es posible extender asio, añadir sus propios eventos asíncronos. ejemplo

Linux tiene una biblioteca asio que no es difícil de usar que las API de Windows para este trabajo (lo he usado). Ambos conjuntos de sistemas operativos implementan la misma arquitectura conceptual. Se diferencian en detalles que son relevantes para escribir una buena biblioteca, pero no hasta el punto de que no se puede tener una interfaz común para ambas plataformas de sistemas operativos (que he usado uno).

Básicamente, todos los sabores de asíncrono File I / O seguir la arquitectura "Fry Cook". Esto es lo que quiero decir en el contexto de una Leer op: I (hilo de procesamiento) subo a un mostrador de comida rápida (OS) y pedir una hamburguesa (algunos datos). Me da una copia de mi boleto fin (algún tipo de estructura de datos) y emite un ticket en la parte posterior de la cocinera (el Kernel y el sistema de archivos) para cocinar mi hamburguesa. entonces voy a sentarse o leer mi teléfono (hacer otros trabajos). Más tarde, alguien anuncia que mi hamburguesa está listo (una señal al hilo de procesamiento) y recoger mi comida (el búfer de lectura).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top