我希望能够定义一个包含一些数据成员的类,以及一个可以访问那些私有数据成员的函数。
然后我想要一个公共函数,它创建一些线程,它们对类的数据成员进行操作。我在编译代码时遇到了一些麻烦。
不要担心互斥或数据保护,这不会成为问题,因为这只是一些用于测试的示例代码。
class foo {
public:
void make_foo_func_threads();
private:
void foo_func();
char private_data;
std::vector<std::thread> some_threads;
}
void foo::foo_func() {
while(1) {
private_data = 'A';
}
}
void foo::make_foo_func_thread() {
for(...) some_threads.push_back(std::thread(foo_func));
for(...) some_threads.join();
}
编译器给出了错误:
'没有匹配调用std :: thread :: thread()'
显然,从<unresolved overloaded function type>
到void (foo::*&&)'
的参数1没有已知转化。
嗯,是的,我不知道除了编译器之外还有什么方法可以解释如何解析foo_func - 我想。
如何帮助编译器理解我想要做的事情,所以不会再烦恼我了。毫无疑问,我所写的代码是不合法的,如果是这样,有人可以解释为什么对我来说就是这种情况。谢谢!
答案 0 :(得分:17)
foo_func
是一个(非static
)成员函数,它需要一个foo
的实例来运行。必须将此实例提供给线程构造函数。如果您参考std::thread::thread参考页面,它会解释在新线程中执行的代码。相关点是指f
是指向成员函数的指针:
- 如果
f
是指向类T
的成员函数的指针,则调用它。返回值被忽略。实际上,执行以下代码:
(t1.*f)(t2, ..., tN)
如果t1
的类型为T
,则引用T
或引用类型T
。((*t1).*f)(t2, ..., tN)
否则。
所以很明显该实例是必需的。
更改为:
for(...) some_threads.push_back(std::thread(&foo::foo_func, this));
#include <iostream>
#include <thread>
#include <vector>
class foo
{
public:
void make_foo_func_threads()
{
for (int i = 0; i < 5; ++i)
some_threads.push_back(std::thread(&foo::foo_func, this));
for (auto& t: some_threads) t.join();
}
private:
void foo_func() { std::cout << "Hello\n"; }
std::vector<std::thread> some_threads;
};
int main()
{
foo f;
f.make_foo_func_threads();
}