Domanda

Ho piccolo problema con la libreria boost :: ASIO. La mia app ricevere ed elaborare dati in modo asincrono, si creano le discussioni ed eseguire io_service.run () su ciascuno di loro.

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
    }
}

Di volta in volta, la mia applicazione riceve un messaggio (attraverso il sistema di messaggistica Windows) da qualche applicazione supervisore che controlla è il mio programma vivo o no. Se la mia applicazione wont risposta, verrà riavviato. La parte difficile qui è quello di verificare, che i thread è in esecuzione e non un punto morto. Posso inviare gestore per io_service in questo modo:

io.post( &reply_to_supervisor );

ma questo metodo colpisce un solo filo. Come posso verificare che tutte le discussioni è in esecuzione e non un punto morto?

È stato utile?

Soluzione

Posso sbagliarmi, ma sarebbe l'uso di un io_service per thread risolvere il tuo problema?

Un'altra idea: pubblicare le chiamate cpu_cnt volte reply_to_supervisor che utilizzano un po sleep() - non è bello, ma dovrebbe funzionare

Altri suggerimenti

Questo mi colpisce come un esempio del Arrestare problema , ma dal momento in cui sembra essere su Windows, si potrebbe desiderare di guardare solo :: infilare biblioteca di Just Software Solution. Si tratta di un'implementazione del progetto di C ++ 0x threading biblioteca e ha built-in di rilevamento stallo nei propri mutex.

In definitiva però si sono probabilmente meglio chiedere a questa domanda sulla ASIO mailing list . L'autore della biblioteca è molto utile, e sia lui o qualche altro utente Hardcore ASIO può essere in grado di fornire una risposta migliore lì.

Ho intenzione di assumere il vostro io-> run () fa una sorta di ciclo per attendere l'ASIO per completare. Ho anche intenzione di assumere si dispone di un timeout su questa operazione ASIO. Un modo sporco per controllare è quello di avere una corsa filo status e controllare che sia il filo ASIO è scaduta ad aspettare per l'ASIO per completare o che un evento ASIO è stato pubblicato. In entrambi i casi, si dovrebbe impostare una sorta di variabile o gestire conoscere il vostro thread è "vivo" e loop. Il tuo filo di stato sarebbe quindi verificare che ogni variabile / manico e li azzerato dopo la verifica.

Intendiamoci, io sono sicuro che ci sono altri modi, ma questo è ciò che è venuto in mente che fin da oggi ... =)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top