Pergunta

Tenho notado que boost.asio tem um monte de exemplos envolvendo tomadas, portas seriais e todos os tipos de exemplos não arquivo. Google não tem realmente virou um monte para mim que menciona se asio é uma boa ou válida abordagem para fazer arquivo E / S assíncrona.

Eu tenho montes de dados eu gostaria de gravar no disco de forma assíncrona. Isso pode ser feito com io sobreposta nativo no Windows (minha plataforma), mas eu prefiro ter uma solução independente de plataforma.

Estou curioso, se

  1. boost.asio tem qualquer tipo de suporte de arquivo
  2. boost.asio suporte de arquivo é maduro o suficiente para o arquivo diário i / o
  3. suporte de arquivo nunca vai ser adicionado? Qual é a perspectiva para isso?
Foi útil?

Solução

Tem boost.asio qualquer tipo de suporte de arquivo?

Começando com (eu acho) Impulso 1,36 (que contém Asio 1.2.0), pode utilizar [boost :: asio ::] Windows :: stream_handle ou janelas :: random_access_handle para embrulhar uma alça e executar métodos de leitura e gravação assíncrona nele que usar a estrutura OVERLAPPED internamente.

Usuário Lazin também menciona boost :: asio :: Windows :: random_access_handle que podem ser usados ??para operações assíncronas (tubos por exemplo nomeados, mas também arquivos).

é boost.asio suporte a arquivos maduro o suficiente para o arquivo diário i / o?

Como Boost.Asio em si é amplamente utilizado por agora, e os usos de implementação sobrepostas IO internamente, eu diria que sim.

suporte de arquivo nunca vai ser adicionado? Qual é a perspectiva para isso?

Como não há nenhum roteiro encontrado na Asio site, eu diria que não haverá novas adições à Boost.Asio para este recurso. Embora há sempre a chance de contribuintes adicionar código e classes para Boost.Asio. Talvez você possa até contribuir as partes em falta você mesmo! : -)

Outras dicas

boost :: asio arquivo i / o no Linux

No Linux, asio usa o mecanismo epoll para detectar se um socket / arquivo descritor está pronto para leitura / escrita. Se você tentar usar baunilha asio em um arquivo regular no Linux você terá uma "operação não permitida" exceção porque epoll não suporta arquivos regulares no Linux .

A solução é configurar asio usar o href="http://linux.die.net/man/2/select" rel="nofollow noreferrer"> select mecanismo no Linux. Você pode fazer isso definindo BOOST_ASIO_DISABLE_EPOLL. O trade-off aqui é escolha tende a ser mais lenta do que epoll se você' re trabalhando com um grande número de soquetes abertos. Abra um arquivo usando regularmente open() e depois passar o descritor de arquivo para um boost::asio::posix::stream_descriptor .

boost :: asio arquivo i / o no Windows

No Windows, você pode usar boost::asio::windows::object_handle para embrulhar um Handle que foi criado a partir de uma operação de arquivo. Consulte exemplo .

ASIO suportes / s sobreposta no Windows onde o apoio é bom. Em Unixes essa idéia estagnou devido a:

  • Os arquivos são muitas vezes localizados no mesmo dispositivo físico, acessando-os sequencialmente é preferível.
  • solicitações de arquivo, muitas vezes concluir muito rapidamente, porque eles são fisicamente perto.
  • Os arquivos são frequentemente críticos para concluir a operação básica de um programa (por exemplo, a leitura em seu arquivo de configuração deve ser feito antes de inicializar mais)

A única exceção comum está servindo arquivos diretamente para soquetes. Este é um especial caso tão comum que o Linux tem uma função do kernel que lida com isso para você. Mais uma vez, negando a razão para usar assíncrona arquivo I / O.

Em resumo:. ASIO parece refletir a filosofia de design OS subjacente, E / S sobreposto sendo ignorado pela maioria dos desenvolvedores Unix, por isso não é suportado nessa plataforma

boost :: asio :: Windows :: random_access_handle é a maneira mais fácil de fazer isso, se você precisa de algo avançado, por exemplo assíncrona LockFileEx ou qualquer outra coisa, você pode estender asio, adicionar seus próprios eventos assíncronos. mailing

Linux tem uma asio Biblioteca que nenhum mais difícil de usar do que as APIs do Windows para este trabalho é (eu usei). Ambos os conjuntos de sistemas operacionais implementar a mesma arquitetura conceitual. Eles diferem em detalhes que são relevantes para escrever uma biblioteca boa, mas não ao ponto que você não pode ter uma interface comum para ambas as plataformas de sistemas operacionais (eu usei um).

Basicamente, todos os sabores de Async File I / O siga a arquitetura "Fry cozinheiro". Aqui está o que eu quero dizer no contexto de um op Leia: I (segmento de processamento) vão até um contador de fast food (OS) e pedir um cheeseburger (alguns dados). Dá-me uma cópia do meu bilhete de ordem (alguma estrutura de dados) e emite um ticket na volta para o cozinheiro (o Kernel e sistema de arquivos) para cozinhar o meu hambúrguer. Eu, então, ir sentar-se ou ler o meu telefone (fazer outro trabalho). Mais tarde, alguém anuncia que o meu hambúrguer está pronto (um sinal para o segmento de processamento) e eu recolher a minha comida (buffer de leitura).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top