Sí, es posible. La solución que se ha sugerido por Galik se ve así:
#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. --- */
}
Sin embargo, esto presenta esencialmente un tercer hilo que realiza la thread.join()
.
. (Nota: El destructor de future
se bloqueará hasta thread
se ha unido y el hilo auxiliar ha terminado)
Tal vez el lanzamiento de un hilo sólo para traer otro hilo hacia abajo no es lo que desea. Hay otro, solución portátil sin un hilo auxiliar:
#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;
donde T_return
es el tipo de retorno de su procedimiento hilo. Este escenario utiliza una combinación de std::future
/std::async
en lugar de std::thread
.
Tenga en cuenta que hThread
es un puntero. Cuando llame al operador delete
, invocará el destructor de *hThread
y bloqueará hasta que el hilo haya finalizado.
He probado ambas versiones con gcc 4.9.3 en Cygwin.
¿Qué te gustaría que ocurra cuando se acabe el tiempo? ¿Se terminará el hilo? –
Esto es lo que 'std :: thread :: native_handle' es para - use las funciones del sistema operativo para hacer una unión temporizada. – ildjarn