2012-06-15 25 views
13

Duplicar posibles:
Start thread with member functionfunciones miembro std :: hilo

Recientemente he estado jugando con la nueva biblioteca std :: hilo en C++ 11 y yo se encontró con un problema Cuando trato de pasar una función clases en un nuevo hilo, me da un error (no tengo el texto de error exacto en este momento ya im fuera de casa) tuve una clase como esta

class A 
{ 
    void FunctA(); 
    void FunctB(); 

    void run() 
    { 
     std::thread t(FunctA); 
     std::thread r(FunctB); 
    } 
} 

Qué am Estoy haciendo mal?

+1

tienen u intentado hacer FunctA/FunctB estática? –

Respuesta

26
class A 
{ 
    void FunctA(); 
    void FunctB(); 

    void run() 
    { 
     std::thread t(&A::FunctA, this); 
     std::thread r(&A::FunctB, this); 
    } 
}; 

Los punteros a funciones miembro son diferentes de punteros a funciones, la sintaxis de llamarlos es diferente, así, y requiere instancia de la clase. Puede pasar el puntero a la instancia como segundo argumento del constructor std::thread.

+1

¿y si tuvieran args? ¿cómo los pasarías? – kdubs

+0

@kdubs: ... como argumentos adicionales a la llamada de constructor. Por favor, lea los documentos en el futuro. – Griwes

+0

¡Este código falla! incluso si agrega la palabra clave 'public' .. –

0

Creo que el problema es que no se puede obtener el puntero a la función miembro de forma similar a las funciones. Here encontrará más información sobre esto.

Además, sería mucho más fácil responder, si proporcionó un texto de error de compipler.

2
class A 
{ 
    public: 
    A(FunctA &fa) : fa(fa) {} 

    struct FunctA 
    { 
     virtual void operator()() = 0; 
    } 
    struct FunctB 
    { 
     void operator()() 
     { 
     // thread B 
     } 
    } 
    FunctA &fa; 
    FunctB fb; 

    void run() 
    { 
     std::thread t(fa); 
     std::thread r(fb); 
    } 
} 

boost documentation

+0

Es tonto. Como en: no inteligente. – Griwes

+0

@Griwes: es innecesariamente detallado, pero funcionaría, por lo que no creo que merezca un voto negativo. – ildjarn

+3

@ildjarn, correcto, tal vez no vale la pena un voto negativo, pero sigue siendo tonto. – Griwes

Cuestiones relacionadas