std::método de llamada de hilo de clase [duplicado]

Posible duplicado:
Iniciar hilo con función miembro

Tengo una clase pequeña:

class Test
{
public:
  void runMultiThread();
private:
  int calculate(int from, int to);
}  

Cómo es posible ejecutar el método calculate con dos conjuntos diferentes de parámetros (por ejemplo calculate(0,10), calculate(11,20)) en dos hilos del método runMultiThread()?

PD Gracias se me olvido que necesito pasar this, como parámetro.

preguntado el 12 de junio de 12 a las 15:06

1 Respuestas

No tan duro:

#include <thread>

void Test::runMultiThread()
{
    std::thread t1(&Test::calculate, this,  0, 10);
    std::thread t2(&Test::calculate, this, 11, 20);
    t1.join();
    t2.join();
}

Si aún se necesita el resultado del cálculo, use un futuro en lugar:

#include <future>

void Test::runMultiThread()
{
     auto f1 = std::async(&Test::calculate, this,  0, 10);
     auto f2 = std::async(&Test::calculate, this, 11, 20);

     auto res1 = f1.get();
     auto res2 = f2.get();
}

Respondido el 12 de junio de 12 a las 15:06

@ravenspoint: si es seguro para subprocesos depende del OP, ¿no? Estoy de acuerdo en que el valor de retorno debe recuperarse, aunque el OP no indica que se pretenda (podría ser como printf). std::async sería una alternativa. - Kerrek SB

@JonathanWakely ¿Quizás porque el OP lo preguntó? Aunque no sabemos si su enfoque es correcto en primer lugar, tal vez haga otros cálculos mientras tanto. - cristian raú

@ravenspoint: la pregunta era cómo ejecutar una función en diferentes subprocesos con diferentes argumentos, y esta respuesta demuestra claramente cómo hacerlo. ¿Cómo es que eso no es útil? - mike seymour

@ravenspoint: Esos son otros preguntas; y no puede Más otro preguntas también. - Nawaz

No pensé que el número de subprocesos sería un punto de discusión. Simplemente estoy demostrando las técnicas; Confío en que el OP puede organizar el código de cualquier manera que se adapte a sus necesidades finales de concurrencia. - Kerrek SB

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.