Estoy tratando de usar std :: hilo de C++ 11. No pude encontrar nada si es posible tener un std :: hilo dentro de una clase que ejecuta uno de sus miembros de función. Considere el siguiente ejemplo ... En mi intento (a continuación), la función se ejecuta().C++ 11: std :: hilo dentro de una clase que ejecuta un miembro de función con inicialización de hilo en el constructor
Compilo con gcc-4.4 con -std = C++ 0x marca.
#ifndef RUNNABLE_H
#define RUNNABLE_H
#include <thread>
class Runnable
{
public:
Runnable() : m_stop(false) {m_thread = std::thread(Runnable::run,this); }
virtual ~Runnable() { stop(); }
void stop() { m_stop = false; m_thread.join(); }
protected:
virtual void run() = 0;
bool m_stop;
private:
std::thread m_thread;
};
class myThread : public Runnable{
protected:
void run() { while(!m_stop){ /* do something... */ }; }
};
#endif // RUNNABLE_H
que estoy recibiendo este error y otros: (mismo error con y sin el $ this)
Runnable.h|9|error: no matching function for call to ‘std::thread::thread(<unresolved overloaded function type>, Runnable* const)’|
Al pasar un puntero.
Runnable.h|9|error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say ‘&Runnable::run’|
Y es por eso que necesita un 'start()' para ser una función que hace el trabajo de inicio real. –
No creo que el hilo que toma el tiempo suficiente para programarse cambie el comportamiento, ¿su constructor no hace una copia (rebanando así) el resultado de bind (& Runnable :: run, this)? – Cubbi
@Etienne de Martel: Hay diferentes enfoques, la opción del método 'start()' es claramente uno de ellos. Otro es el enfoque adoptado por boost y C++ 0x: separe el objeto * ejecutable * del objeto * thread *, que hará que la operación se ejecute como argumento para el constructor. Eso asegura que el objeto que se va a ejecutar está completamente construido. Eso es, por supuesto, si no se abre camino en un marco que lo rompe ... –