Pregunta

Me pregunto el mejor forma de iniciar un pthread que es un miembro de una clase de C++?Mi propio enfoque surge como una respuesta...

¿Fue útil?

Solución

Yo normalmente uso una función miembro estática de la clase, y el uso de un puntero a la clase como el vacío * el parámetro.Que función se puede realizar hilo de procesamiento, o llamar a otra función miembro no estático con la referencia de la clase.Que función se puede hacer referencia a todos los miembros de la clase sin torpe sintaxis.

Otros consejos

Esto puede ser hecho mediante el impulso de la biblioteca, como este:

#include <boost/thread.hpp>

// define class to model or control a particular kind of widget
class cWidget
{
public:
void Run();
}

// construct an instance of the widget modeller or controller
cWidget theWidget;

// start new thread by invoking method run on theWidget instance

boost::thread* pThread = new boost::thread(
    &cWidget::Run,      // pointer to member function to execute in thread
    &theWidget);        // pointer to instance of class

Notas:

  • Este sistema utiliza una ordinaria función miembro de clase.No hay necesidad de añadir, a los miembros estáticos que confundir a su interfaz de clase
  • Sólo tienes que incluir boost/hilo.hpp en el archivo de origen donde se inicia el hilo.Si usted apenas está comenzando con impulso, todo el resto de grandes e intimidantes que el paquete puede ser ignorado.

En C++11 usted puede hacer lo mismo pero sin impulso

// define class to model or control a particular kind of widget
class cWidget
{
public:
void Run();
}

// construct an instance of the widget modeller or controller
cWidget theWidget;

// start new thread by invoking method run on theWidget instance

std::thread * pThread = new std::thread(
    &cWidget::Run,      // pointer to member function to execute in thread
    &theWidget);        // pointer to instance of class

Usted tiene que bootstrap usando el vacío* el parámetro:

class A
{
  static void* StaticThreadProc(void *arg)
  {
    return reinterpret_cast<A*>(arg)->ThreadProc();
  }

  void* ThreadProc(void)
  {
    // do stuff
  }
};

...

pthread_t theThread;
pthread_create(&theThread, NULL, &A::StaticThreadProc, this);

He utilizado tres de los métodos descritos anteriormente.Cuando utilicé por primera vez roscado en c++ que he usado las funciones miembro estáticas, a continuación, amigo funciones y, finalmente, la IMPULSO de las bibliotecas.Actualmente prefiero IMPULSO.Durante los últimos años me he vuelto bastante el IMPULSO bigot.

BOOST es para C++ como CPAN es Perl.:)

El impulso de la biblioteca proporciona un mecanismo de copia, lo que ayuda a la transferencia de la información de los objetos para el nuevo hilo.En el otro impulso ejemplo boost::bind se copiarán con un puntero, que también se acaba de copiar.Así que tendrás que cuidar para la validez de su objeto de evitar un colgando puntero.En el caso de implementar el operador() y proporcionar un constructor de copia lugar y pasar el objeto directamente, no tienen que ocuparse de ella.

Una mucho mejor solución que evita un montón de problemas:

#include <boost/thread.hpp>

class MyClass {
public:
        MyClass(int i);
        MyClass(const MyClass& myClass);  // Copy-Constructor
        void operator()() const;          // entry point for the new thread

        virtual void doSomething();       // Now you can use virtual functions

private:
        int i;                            // and also fields very easily
};

MyClass clazz(1);
// Passing the object directly will create a copy internally
// Now you don't have to worry about the validity of the clazz object above
// after starting the other thread
// The operator() will be executed for the new thread.
boost::thread thread(clazz);             // create the object on the stack

El otro impulso ejemplo crea el subproceso objeto en el heap, a pesar de que no tiene ningún sentido hacerlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top