c ++ 11线程,静态或非静态类成员函数,参数的含义

时间:2015-06-08 16:03:45

标签: c++ multithreading c++11

我一直在玩c ++ 11线程,并且有一些问题。人们说当你在线程中调用类成员函数时,这个函数必须是static。但似乎这不是真的。例如,我发现了这个:

class bar
{ public:
void foo() {std::out << "Hello" << std::endl};
}
int main()
{
std::thread t0(&bar::foo, bar());
t0.join();
}

上面的代码工作正常。似乎成员函数在c ++ 11标准中不必是静态的。我想知道我的理解是否属实。另一个问题是,如果我只是用“static void foo()”修改“void foo()”,我会收到一个错误:

error: no type named 'type' in 'class std::result_of<void (*(bar))()>'

我不明白这一点,但似乎这是因为我调用线程的方式不正确。我在调用线程中的函数时非常困惑。例如,我发现在上面的例子中调用相同的成员函数的另一种方法是

int main()
{ bar A;
std::thread t0(&bar::foo, &A);
}

它也有效!我不知道这两种方式的区别。似乎第一种方式是每次调用foo()时都会执行类的构造函数,而在第二种方式中它不会执行。真的吗?此外,当在另一个类成员函数中调用成员函数时,必须传递'this'。

我搜索互联网,我所能找到的只是例子,而没有解释论证的含义。任何人都可以告诉我如何在std::thread

中设置参数(尤其是前三个)

1 个答案:

答案 0 :(得分:1)

std::thread t0(&bar::foo)使用静态foo方法非常好。

此外,当提出问题时,请考虑提供正常工作的代码,而不是文字您刚才在本网站的文本字段中实际写的内容。

对您的问题的简短回答:为非静态类方法提供this参数,或者如果它是静态类方法则不提供它。

但是,如果你不明白,你必须知道一件事: 每个类方法都与this对象一起使用,这意味着指向当前对象的常量指针。在绑定你的函数时(我想在std::thread内完全绑定工作),第一个参数必须是你想要调用的方法的对象。否则它没有意义:你正试图用什么对象做某事呢? this存在于类的每个非静态方法中,隐含地,由方法的第一个参数存在。

我建议你阅读the definitive c++ stackoverflow book guide and list