如何使用C ++ 11线程类在单独的线程中执行类成员函数?

时间:2013-03-31 21:15:05

标签: c++ c++11 clang xcode4.6

我正在尝试使用C ++ 11的std::thread类来运行类的成员函数以并行执行。

头文件的代码类似于:

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

cpp文件类似于:

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

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

我在Mac OS X 10.8.3下使用Xcode 4.6.1。我使用的编译器是Apple LLVM 4.2,随Xcode一起提供。

上述代码不起作用。编译器错误表示"Attempted to use deleted function"

在线程创建线上,它显示以下按摩。

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

我是C ++ 11和线程类的新手。有人能帮助我吗?

2 个答案:

答案 0 :(得分:22)

实例应该是第二个参数,如下所示:

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

答案 1 :(得分:1)

我仍然遇到上述答案的问题(我认为它抱怨它无法复制智能指针?),所以用lambda重新说明它:

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

然后编译并运行正常。 AFAIK,这同样有效,我个人觉得它更具可读性。

(注意:我还将join()更改为detach(),因为我预计这是意图。)