Angenommen, Sie haben einen externen synchronen Code, den Sie nicht ändern können, und Sie benötigen ihn für die Ausführung von async, müssen ihn aber auch abbrechen können. Wenn der externe Code blockiert, habe ich zwei Möglichkeiten.
A) Machen Sie den Benutzer täuschend und lassen Sie meine Async-Methode sofort nach dem Abbruch zurückkehren. Dabei ist mir bewusst, dass der Code irgendwo noch immer ausgeführt wird.
B) Ausführung abbrechen
Ich würde gerne eine Schnittstelle für Option B implementieren
%Vor%Im obigen Code kann ich mich nicht mit der Einschränkung des blockierenden externen Codes herumschlagen, wie kann ich, wenn überhaupt, die Ausführung vorzeitig abbrechen?
Beenden / beenden Sie die Thread-Ausführung nicht, es sei denn, sie ist unternehmenskritisch. Verwenden Sie stattdessen "A".
Wie @Caleth bemerkt hat, gibt es keinen standardmäßigen oder plattformübergreifenden Weg, dies zu tun. Alles, was Sie tun können, ist, ein natives Handle zu einem Thread zu bekommen und eine plattformspezifische Funktion zu verwenden. Aber es gibt einige wichtige Grubenstürze.
Sie können einen Thread mit TerminateThread
thread_local
Variablen werden nicht zerstört MSDN sagt:
TerminateThread ist eine gefährliche Funktion, die nur in verwendet werden sollte die extremsten Fälle.
Hier ist die Situation etwas besser. Sie haben die Möglichkeit, Ihre Ressourcen freizugeben, wenn pthread_cancel
aufgerufen wird, aber:
for(;;);
nicht abgebrochen . try
/ catch
abgefangen werden kann, aber sie muss erneut geworfen werden. pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, nullptr);
deaktiviert werden. Wenn der Abbruchpunkt jedoch nicht erreicht wird, werden die Ressourcen nicht freigegeben (wie für win32 ) Sie können das sehen:
pthread_setcanceltype
führt zum Hängen. pthread
-Ausnahme konnte abgefangen werden. Es gibt keine Möglichkeit, einen Thread vorzeitig zu beenden.
Abhängig von Ihrer Plattform können Wege sein, einen Thread zu beenden, für den Sie wahrscheinlich std::thread::native_handle
verwenden müssen. Dies führt sehr wahrscheinlich zu undefiniertem Verhalten, daher empfehle ich es nicht.
Sie können diesen externen synchronen Code in einem anderen Prozess ausführen und diesen gesamten Prozess beenden. Auf diese Weise hat die Unterbrechung keinen Einfluss auf Ihren Prozess und führt zu undefiniertem Verhalten.
Tags und Links c++ c++11 asynchronous