Ja, es ist möglich. Die Lösung, die von Galik vorgeschlagen wurde, sieht wie folgt aus:
#include <thread>
#include <future>
...
// Launch the thread.
std::thread thread(ThreadFnc, ...);
...
// Terminate the thread.
auto future = std::async(std::launch::async, &std::thread::join, &thread);
if (future.wait_for(std::chrono::seconds(5))
== std::future_status::timeout) {
/* --- Do something, if thread has not terminated within 5 s. --- */
}
Dies ist jedoch im Wesentlichen einen dritten Thread startet, die die thread.join()
ausführt.
. (Anmerkung: Der Destruktor von future
wird blockiert, bis thread
und der Hilfs Thread beendet hat beigetreten)
Vielleicht einen Thread startet gerade ist, einen anderen Thread bringen nicht das, was Sie wollen. Es gibt eine andere, tragbare Lösung ohne Hilfsgewinde:
#include <thread>
#include <future>
...
// Launch the thread.
std::future<T_return>* hThread
= new std::future<T_return>(std::async(std::launch::async, ThreadFnc, ...));
...
// Terminate the thread.
if (hThread->wait_for(std::chrono::seconds(5))
== std::future_status::timeout) {
/* --- Do something, if thread has not terminated within 5 s. --- */
} else
delete hThread;
wo T_return
der Rückgabetyp der Threads Prozedur ist. In diesem Szenario wird eine std::future
/std::async
Kombination anstelle einer std::thread
verwendet.
Beachten Sie, dass hThread
ein Zeiger ist. Wenn Sie den Operator delete
aufrufen, wird der Destruktor *hThread
aufgerufen und blockiert, bis der Thread beendet ist.
Ich habe beide Versionen mit gcc 4.9.3 auf Cygwin getestet.
Was möchten Sie tun, wenn die Zeit abläuft? Würde der Thread beendet werden? –
Dies ist, was "std :: thread :: native_handle" ist - verwenden Sie Betriebssystemfunktionen, um eine zeitgesteuerte Verknüpfung zu erstellen. – ildjarn