-->

How to execute a class member function in a separa

2019-01-18 20:57发布

问题:

I'm trying to use the C++11's std::thread class to run a member function of a class to execute in parallel.

The header file's code is similar to:

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

The cpp file is similar to:

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

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

I am using Xcode 4.6.1 under Mac OS X 10.8.3. The compiler I am using is Apple LLVM 4.2 which came with the Xcode.

The above code does not work. The compiler error says that "Attempted to use deleted function".

On the line of thread creation it shows the following massage.

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

I'm new in C++11 and the thread class. Could someone help me?

回答1:

The instance should be the second argument, like so:

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


回答2:

I still had problems with the above answer (I think it was complaining it could not copy over a smart pointer?), so rephrased it with a lambda:

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

Then it compiled and ran fine. AFAIK, this is just as efficient, and personally I find it more readable.

(Note: I've also changed join() to detach() as I expect that was the intent.)