Wie die Umsetzung-timeout für die Funktion in c++
Ich habe die Funktion f;
Ich möchte throw Ausnahme 1s nach f starten.
Ich kann es nicht ändern, f(). Es es möglich es in c++?
try {
f();
}
catch (TimeoutException& e) {
//timeout
}
Möglich, Duplikat der Was ist der sauberste Weg, um erstellen Sie einen timeout für eine while-Schleife?
Können Sie den code ändern Aufruf
ja, kann ich ändern-code-Aufruf f
Wie Sie es umsetzen, hängt davon ab, was
Nein - sobald Sie Ihren code eingibt
Können Sie den code ändern Aufruf
f
? I. e. der code innerhalb der try
block?ja, kann ich ändern-code-Aufruf f
Wie Sie es umsetzen, hängt davon ab, was
f()
tut. Sie können nicht nur Auslöser einer Laufenden Funktion.Nein - sobald Sie Ihren code eingibt
f()
Sie sind nicht mehr unter Kontrolle. Klingt wie ein X/Y-problem, was sind Sie wirklich versuchen, zu erreichen?InformationsquelleAutor Newbie | 2016-11-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erstellen Sie einen separaten thread ausführen, die sich selbst aufrufen, und warten auf eine Bedingung variable in der main-thread, die wird signalisiert durch den thread tun, der Aufruf
f
sobald es gibt. Der trick ist, zu warten auf die bedingungsvariable mit den 1s-timeout, so dass, wenn der Anruf länger dauert als das timeout werden Sie noch wach, es wissen, und werden in der Lage, Ausnahme - alle im Haupt-thread. Hier ist der code (live-demo hier):f()
ausgeführt werden. Wenn erneut ausführen, bevorf()
Austritte aus der 1. Versuch istf()
thread-sicher? Sieht so aus könnte viel mehr Probleme.Die OP hat nicht Stand, dass das anhalten
f
ist eine Voraussetzung. Re-entrancy / thread-Sicherheitsprobleme gelöst werden können, mit diesem Ansatz mit weiteren Ausarbeitung - was ist hier ist genug zu zeigen, die Essenz.warum fängt man
m
im lambda ?Weiß nicht. Bearbeitet, entfernen Sie sagte capture
InformationsquelleAutor Smeeheey
Können Sie einen neuen thread erstellen und asynchron warten Sie für 1s auf Durchgang, und dann eine exception zu werfen. Ausnahmen können nur gefangen werden, im gleichen thread, wo Sie sind geworfen, so dass Sie nicht fangen Sie in dem gleichen thread wo du genannt
f()
, wie in deinem Beispiel - code- aber das ist nicht die angegebene Voraussetzung, so kann es OK für Sie.Nur, wenn
f
garantiert Rendite in weniger als 1s, können Sie diese synchron:f()
Aber es kann ziemlich schwierig sein, zu beweisen, dass
f
tatsächlich zurück in der Zeit.InformationsquelleAutor eerorika