2013-03-31 9 views
15

Próbuję użyć klasy C++ 11 std::thread do uruchomienia funkcji składowej klasy, aby wykonać ją równolegle.Jak wykonać funkcję członka klasy w osobnym wątku przy użyciu klasy wątków C++ 11?

kod pliku nagłówka jest podobny do:

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

plik cpp jest podobny do:

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

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

używam Xcode 4.6.1 pod Mac OS X 10.8.3. Używany kompilator to Apple LLVM 4.2, który jest dostarczany z Xcode.

Powyższy kod nie działa. Błąd kompilatora mówi, że "Attempted to use deleted function".

Na linii tworzenia wątku pokazuje następujący masaż.

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

Jestem nowy w C++ 11 i klasie wątków. Czy ktoś mógłby mi pomóc?

Odpowiedz

21

Instancja powinien być drugi argument, tak jak poniżej:

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

Warto podkreślić, że kod OP jest bezużyteczny, jeśli nazywa '.join()' natychmiast. –

+0

Wielkie dzięki. –

1

wciąż miałem problemy z powyższym odpowiedź (? Myślę, że nie narzekał, że nie mógł skopiować inteligentnego wskaźnika), więc przeformułować je z lambda:

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

Następnie skompilowano i uruchomiono poprawnie. AFAIK, jest to równie skuteczne i osobiście uważam, że jest bardziej czytelny.

(Uwaga:. Ja również zmienił join() do detach() jak spodziewam się, że było intencją)

Powiązane problemy