17

我正在尝试使用 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。我使用的编译器是 Xcode 附带的 Apple LLVM 4.2。

上面的代码不起作用。编译器错误说"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 和线程类的新手。有人可以帮助我吗?

4

2 回答 2

22

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

std::thread t1(&SomeClass::threadFunction, *this, arg1, arg2);
于 2013-03-31T21:16:46.250 回答
1

我仍然对上述答案有疑问(我认为它抱怨它无法复制智能指针?),所以用 lambda 重新表述:

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

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

(注意:我也改变join()了,detach()正如我所期望的那样。)

于 2015-04-24T12:24:56.813 回答