2013-03-31 17 views
15

Sto cercando di utilizzare la classe std::thread del C++ 11 per eseguire una funzione membro di una classe da eseguire in parallelo.Come eseguire una funzione membro della classe in un thread separato utilizzando la classe thread C++ 11?

codice del file di intestazione è simile a:

class SomeClass { 
    vector<int> classVector; 
    void threadFunction(bool arg1, bool arg2); 
public: 
    void otherFunction(); 
}; 

Il file cpp è simile a:

void SomeClass::threadFunction(bool arg1, bool arg2) { 
    //thread task 
} 

void SomeClass::otherFunction() { 
    thread t1(&SomeClass::threadFunction, arg1, arg2, *this); 
    t1.join(); 
} 

Sto usando Xcode 4.6.1 con Mac OS X 10.8.3. Il compilatore che sto usando è Apple LLVM 4.2 fornito con Xcode.

Il codice sopra riportato non funziona. L'errore del compilatore dice che "Attempted to use deleted function".

Sulla linea di creazione del filo mostra il seguente massaggio.

In instantiation of function template specialization 'std::__1::thread::thread<void (SomeClass::*)(bool, bool), bool &, bool &, FETD2DSolver &, void>' requested here 

Sono nuovo in C++ 11 e nella classe thread. Qualcuno potrebbe aiutarmi?

risposta

21

L'istanza dovrebbe essere il secondo argomento, in questo modo:

std::thread t1(&SomeClass::threadFunction, *this, arg1, arg2); 
+7

Vale la pena sottolineare che il codice PO è inutile se lui chiama '.join()' immediatamente. –

+0

Grazie mille funziona. –

1

ho ancora avuto problemi con la risposta di cui sopra (? Penso che si lamentava di non poter copiare un puntatore intelligente), così riformulato esso con un lambda:

void SomeClass::otherFunction() { 
    thread t1([this,arg1,arg2](){ threadFunction(arg1,arg2); }); 
    t1.detach(); 
} 

Quindi ha compilato e funzionava bene. AFAIK, questo è altrettanto efficiente, e personalmente lo trovo più leggibile.

(Nota:. Ho anche cambiato join() a detach() come mi aspetto che era l'intento)

Problemi correlati