Como detectar impasse whith biblioteca Asio?
-
21-08-2019 - |
Pergunta
i têm pouco problema com boost :: asio biblioteca. Meu aplicativo receber e processar dados de forma assíncrona, é criar tópicos e executar io_service.run () em cada um deles.
boost::asio::io_service io;
boost::thread_group thread_pool;
...
int cpu_cnt = get_cpu_count();
for (int i = 0; i < cpu_cnt; ++i)
{
thread_pool.create_thread( boost::bind(&run_service, &io) );
}
void run_service(boost::asio::io_service* io)
{
try
{
io->run();//make fun
}
catch(const std::exception& e)
{ //process error
}
catch(...)
{ //process error
}
}
De tempos em tempos, meu aplicativo recebe mensagem (através do Windows Messaging System) de algum aplicativo supervisor que os controlos é o meu programa vivo ou não. Se a minha candidatura não vai responder, ele será reiniciado. A parte complicada aqui é verificar, que tópicos está em execução e não num beco sem saída. Eu posso postar manipulador para io_service assim:
io.post( &reply_to_supervisor );
mas este método afeta apenas um segmento. Como posso verificar se os tópicos está em execução e não num impasse?
Solução
Posso estar errado, mas seria o uso de um io_service por thread resolveu seu problema?
Outra idéia: pós chamadas vezes cpu_cnt
reply_to_supervisor
que usam um pouco sleep()
- não é agradável, mas deve funcionar
Outras dicas
Isso me parece uma instância do Travar Problema , mas desde que você parece ser no Windows, você pode querer olhar em biblioteca apenas :: segmento de Just Software Solution. É uma implementação do projecto de C ++ 0x rosqueamento biblioteca, e foi construído com detecção de impasse em seus próprios semáforos.
Em última análise, se você é provavelmente melhor fora de fazer esta pergunta no asio lista de discussão . O autor da biblioteca é bastante útil, e ele ou algum outro incondicional asio usuário pode ser capaz de fornecer uma resposta lá melhor.
Eu vou assumir o seu io-> run () faz uma espécie de loop para esperar o asio para ser concluído. Eu também estou indo supor que você tem um tempo limite sobre esta operação ASIO. Uma maneira sujo para verificação é ter uma corrida fio status e verificar que tanto o segmento asio expirou em espera para o asio a completa ou que um evento asio foi postado. De qualquer maneira, você deve definir algum tipo de variável ou alça para saber seu segmento está "vivo" e looping. Seu segmento de status, então, verificar se cada variável / alça e redefini-las após a verificação.
Mind você, eu estou certo de que há outras maneiras, mas isso é o que me veio à mente a partir de agora ... =)