我有类对象 Chat *p
,我希望在其上运行方法 Foo(int num)
(通常由 p 运行-> 例如 Foo(3)
)。
我写了这段代码:
std::thread F(&Chat::Foo, 4);
不过,它没有编译给我,而且我也看到了一个错误,因为我无法将 p -> Foo
放入其中(而不是 &Chat::Foo
...)
如何正确运行这段代码?
谢谢!
最佳答案
对象方法实际工作原理的答案。当您调用 p->foo(3)
时,编译器将其翻译成什么,粗略地说,就是 Chat::foo(p, 3)
。 P
在对函数的任何调用中始终作为隐藏参数传递。 C++ 不会向您展示这一点,您实际上也不能调用 Chat::foo(p, 3)
,这是不允许的,但它大致说明了现实中的工作原理。
在任何成员函数中可用的变量 this
只是作为隐藏的第一个参数传入的地址,您在函数中访问的任何成员变量都引用隐藏的第一个参数。所以......为了调用任何成员函数作为线程的起点,你需要做的是将指针传递给对象作为它的第一个参数。 std::thread F(&Chat::Foo, p, 4);
我相信会正确启动线程。
关于c++ - 为类对象创建线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21422543/