Frage

Ich habe kleines Problem mit boost :: asio Bibliothek. Meine App empfangen und verarbeiten Daten asynchron, es Threads erstellen und ausführen io_service.run () auf jedem von ihnen.

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

Zeit nach der Zeit, meine Anwendung empfängt Nachricht (über Windows Messaging System) von einer Supervisor-Anwendung, die mein Programm am Leben oder nicht überprüft ist. Wenn meine Anwendung wird nicht antworten, wird es neu gestartet. Der schwierige Teil ist hier zu überprüfen, dass Threads ausgeführt wird und nicht blockiert. Ich kann Handler schreiben wie diese io_service:

io.post( &reply_to_supervisor );

aber diese Methode wirkt sich nur auf einen Thread. Wie kann ich überprüfen, ob alle Threads ausgeführt wird und nicht festgefahren?

War es hilfreich?

Lösung

ich kann mich irren, aber wäre der Einsatz ein io_service pro Thread lösen Ihr Problem?

Eine andere Idee: post cpu_cnt mal Anrufe reply_to_supervisor, die ein wenig sleep() verwenden - nicht schön, aber sollte funktionieren

Andere Tipps

Das erscheint mir als eine Instanz des Halting Problem , aber da Sie zu sein scheinen unter Windows, können Sie nur bei Just Software Solution aussehen :: thread Bibliothek. Es ist eine Implementierung des C ++ 0x Entwurfs Bibliothek Threading, und verfügt über eine integrierte in Deadlock-Erkennung in einem eigenen mutexes.

Letztlich aber Sie wahrscheinlich besser dran sind, diese Frage auf der fragen Asio Mailingliste . Der Autor der Bibliothek ist sehr hilfreich, und entweder er oder ein anderer hardcore Asio Benutzer kann in der Lage sein, eine bessere Antwort zu geben.

Ich werde Ihre io-> run () ist eine Art Schleife zu übernehmen für die Asio warten zu vervollständigen. Ich werde auch annehmen, dass Sie auf diesem Asio Betrieb einen Timeout haben. Eine schmutzige Art und Weise zu überprüfen, ist einen Status-Thread ausgeführt hat und prüfen, ob entweder der Asio Thread abgelaufen ist für die Asio auf der Warteliste zu vervollständigen oder dass ein Asio Event gebucht wurde. So oder so, würden Sie irgendeine Art von Variable oder Griff Thread wissen, ist „lebendig“ und Looping. Ihr Status Thread würde dann überprüfen, dass jede Variable / Griff und setzen Sie sie nach der Überprüfung.

Wohlgemerkt, ich bin sicher, dass es andere Möglichkeiten gibt, aber das ist, was später als von jetzt ... =)

in den Sinn
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top