c++ Iniciar hilo con función miembro



2 Answers

Ya que está utilizando C ++ 11, lambda-expresión es una solución agradable y limpia.

class blub {
    void test() {}
  public:
    std::thread spawn() {
      return std::thread( [this] { this->test(); } );
    }
};

ya que this-> se puede omitir, se podría acortar a:

std::thread( [this] { test(); } )

o solo

std::thread( [=] { test(); } )
c++ multithreading c++11

Estoy intentando construir un std::thread con una función miembro que no toma argumentos y devuelve void . No puedo entender ninguna sintaxis que funcione - el compilador se queja sin importar qué. ¿Cuál es la forma correcta de implementar spawn() para que devuelva un std::thread que ejecute test() ?

#include <thread>
class blub {
  void test() {
  }
public:
  std::thread spawn() {
    return { test };
  }
};



@ hop5 y @RnMss sugirieron usar las lambdas de C ++ 11, pero si trata con punteros, puede usarlos directamente:

#include <thread>
#include <iostream>

class CFoo {
  public:
    int m_i = 0;
    void bar() {
      ++m_i;
    }
};

int main() {
  CFoo foo;
  std::thread t1(&CFoo::bar, &foo);
  t1.join();
  std::thread t2(&CFoo::bar, &foo);
  t2.join();
  std::cout << foo.m_i << std::endl;
  return 0;
}

salidas

2

La muestra reescrita de esta respuesta sería entonces:

#include <thread>
#include <iostream>

class Wrapper {
  public:
      void member1() {
          std::cout << "i am member1" << std::endl;
      }
      void member2(const char *arg1, unsigned arg2) {
          std::cout << "i am member2 and my first arg is (" << arg1 << ") and second arg is (" << arg2 << ")" << std::endl;
      }
      std::thread member1Thread() {
          return std::thread(&Wrapper::member1, this);
      }
      std::thread member2Thread(const char *arg1, unsigned arg2) {
          return std::thread(&Wrapper::member2, this, arg1, arg2);
      }
};

int main() {
  Wrapper *w = new Wrapper();
  std::thread tw1 = w->member1Thread();
  tw1.join();
  std::thread tw2 = w->member2Thread("hello", 100);
  tw2.join();
  return 0;
}



Related