c++ - paquetes - ¿Cuál es el problema con boost.asio y file i/o?
r repository (5)
Tiene boost.asio cualquier tipo de soporte de archivos?
Comenzando con (creo) Boost 1.36 (que contiene Asio 1.2.0) puede usar [boost :: asio ::] windows :: stream_handle o windows :: random_access_handle para envolver un HANDLE y realizar métodos asíncronos de lectura y escritura que use la estructura OVERLAPPED internamente.
El usuario Lazin también menciona boost :: asio :: windows :: random_access_handle que se puede usar para operaciones asincrónicas (por ejemplo, canalizaciones con nombre, pero también archivos).
¿El soporte de archivos boost.asio es lo suficientemente maduro para archivos de E / S diarios?
Como Boost.Asio en sí mismo es ampliamente utilizado por el momento, y la implementación usa IO superpuesto internamente, yo diría que sí.
¿Alguna vez se agregará el soporte de archivos? ¿Cuál es la perspectiva de esto?
Como no hay una hoja de ruta en el sitio web de Asio , diría que no habrá nuevas incorporaciones a Boost.Asio para esta función. Aunque siempre existe la posibilidad de que los contribuyentes agreguen código y clases a Boost.Asio. ¡Quizás incluso puedas contribuir con las partes que te faltan! :-)
Me he dado cuenta de que boost.asio tiene muchos ejemplos que involucran sockets, puertos serie y todo tipo de ejemplos que no son de archivo. Google no ha presentado mucho para mí que mencione si asio es un enfoque bueno o válido para hacer archivos asíncronos de E / S.
Tengo muchos datos que me gustaría escribir en el disco de forma asíncrona. Esto se puede hacer con io superpuesto nativo en Windows (mi plataforma), pero preferiría tener una solución independiente de plataforma.
Tengo curiosidad si
- boost.asio tiene algún tipo de soporte de archivos
- El soporte de archivos boost.asio es lo suficientemente maduro para el archivo diario de E / S
- ¿Alguna vez se agregará el soporte de archivos? ¿Cuál es la perspectiva de esto?
ASIO admite E / S superpuestas en Windows donde el soporte es bueno. En Unixes, esta idea se ha estancado debido a:
- Los archivos a menudo se encuentran en el mismo dispositivo físico, es preferible acceder a ellos secuencialmente.
- Las solicitudes de archivos a menudo se completan muy rápidamente porque están físicamente cerca.
- Los archivos son a menudo críticos para completar la operación básica de un programa (por ejemplo, leer en su archivo de configuración debe hacerse antes de inicializarlo)
La única excepción común es servir archivos directamente en sockets. Este es un caso especial tan común que Linux tiene una función de kernel que maneja esto por usted. Nuevamente, negando la razón para usar E / S de archivo asíncrono.
En resumen: ASIO parece reflejar la filosofía de diseño del sistema operativo subyacente, ya que la mayoría de los desarrolladores de Unix ignoran las E / S superpuestas, por lo que no es compatible con esa plataforma.
Linux tiene una biblioteca asio que no es más 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. Difieren en los 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 OS (he usado una).
Básicamente, todos los sabores de Async File I / O siguen la arquitectura "Fry Cook". Esto es lo que quiero decir en el contexto de una operación de lectura: I (subproceso de procesamiento) vaya a un contador de comida rápida (OS) y solicite una hamburguesa con queso (algunos datos). Me da una copia de mi ticket de pedido (alguna estructura de datos) y emite un ticket en la parte posterior del cocinero (el Kernel y el sistema de archivos) para cocinar mi hamburguesa. Luego me siento o leo mi teléfono (hago otro trabajo). Más tarde, alguien anuncia que mi hamburguesa está lista (una señal para el hilo de procesamiento) y recojo mi comida (el buffer de lectura).
boost :: asio :: windows :: random_access_handle es la manera más fácil de hacer esto, si necesita algo avanzado, por ejemplo, LockFileEx asíncrono u otra cosa, puede extender asio, agregar sus propios eventos asincrónicos. example
boost :: asio file i / o en Linux
En Linux, asio usa el mecanismo epoll
para detectar si un descriptor de socket / archivo está listo para leer / escribir. Si intentas utilizar asilo vainilla en un archivo normal en Linux obtendrás una excepción de "operación no permitida" porque epoll no admite archivos regulares en Linux .
La solución alternativa es configurar asio para usar el mecanismo de select
en Linux. Puedes hacer esto definiendo BOOST_ASIO_DISABLE_EPOLL
. La compensación aquí seleccionada es más lenta que epoll si está trabajando con una gran cantidad de sockets abiertos. Abra un archivo regularmente usando open()
y luego pase el descriptor de archivo a un boost::asio::posix::stream_descriptor
.
boost :: asio file i / o en Windows
En Windows puede usar boost::asio::windows::object_handle
para envolver un Handle
creado a partir de una operación de archivo. Ver example .