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?

Foi útil?

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 ... =)

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