Cómo lograr que un subproceso en multiprocesamiento termine primero y el hilo principal continúe ejecutándose.
Intento implementar una función: el hilo principal crea múltiples sub-hilos y bloquea al hilo principal, y despierta al hilo principal para continuar la ejecución cuando cualquiera de los sub-hilos termina.
El siguiente código es mi intento de usar std::future en C++11:
std::pair<size_t, size_t=""> fun(size_t i, size_t j)
{
std::this_thread::sleep_for(std::chrono::seconds(i * j));
return { i, j };
}
int main()
{
std::shared_future<><size_t, size_t="">> ret;
std::pair<size_t, size_t=""> temp;
ret = std::async(std::launch::async, fun, 10, 9);
ret = std::async(std::launch::async, fun, 5, 4);
ret = std::async(std::launch::async, fun, 2, 1);
temp = ret.get();
std::cout << temp.first << "\t" << temp.second << "\n";
return 0;
}
Para el resultado, espero que el programa produzca directamente “2 1” después de (2 * 1) segundos y termine el hilo principal, pero en mi intento, el programa necesita esperar a que el primer sub-hilo duerma por (10 * 9) segundos antes de producir “2 1” y finalizar el hilo principal.</size_t,></size_t,></size_t,>
davy.ai
Para lograr el resultado deseado de bloquear el hilo principal y despertarlo cuando uno de los sub-hilos termine, podemos hacer uso de std::promise y std::future. Aquí hay una posible implementación:
En esta implementación, creamos tres promesas y futuros asociados, uno para cada sub-hilo. Luego creamos los sub-hilos y les pasamos las promesas como argumentos de referencia. Los sub-hilos llaman a la función sub_thread, que duerme durante la cantidad de tiempo especificada y luego establece el valor para la promesa asociada usando el método set_value.
En el hilo principal, creamos un vector de futuros y empujamos los tres futuros en él. Luego usamos la función when_any del espacio de nombres experimental (ya que aún no es parte del estándar en el momento de escribir esto) para bloquear el hilo principal hasta que alguno de los futuros esté listo. Esta función devuelve un par que consiste en un iterador al futuro listo y un índice entero que indica su posición en el vector de futuros. Usamos el método get para recuperar el par de valores almacenados en el futuro listo e imprimirlos. Finalmente, unimos los sub-hilos y regresamos.</size_t,></size_t,></size_t,></size_t,></size_t,></size_t,>