La mejor manera de empezar un hilo como miembro de una clase de C++?
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...
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.