使用来自同一类的函数在类内创建线程
Create thread inside class with function from same class
我希望能够定义一个具有一些数据成员的类,以及一个可以访问这些数据成员的函数,这些数据成员是私有的。
然后我想要一个公共函数,它创建一些线程,这些线程对类的数据成员进行操作。我在编译代码时遇到了一些问题。
不要担心互斥或数据保护,这不会是一个问题,因为这只是一些用于测试的示例代码。
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()的匹配调用'
显然,参数1从<unresolved overloaded function type>
到void (foo::*&&)'
没有已知的转换。
嗯,是的,我不知道这意味着什么,除了编译器在理解如何解决foo_func方面有困难之外——我想。
我该如何帮助编译器理解我要做什么,这样就不会再出现任何错误了。毫无疑问,我写的代码是不合法的,如果是这样的话,有人可以向我解释为什么会这样。谢谢!
foo_func
是一个(非static
)成员函数,它需要一个foo
的实例来操作。必须将此实例提供给线程构造函数。如果您参考std::thread::thread引用页面,它会解释在新线程中执行的代码。相关的一点是指f
是指向成员函数的指针:
- 如果
f
是指向类T
的成员函数的指针,则调用它。返回值将被忽略。实际上,执行以下代码:
- 如果
t1
的类型是T
、对T
的引用或对从T
派生的类型的引用,则为(t1.*f)(t2, ..., tN)
- 否则为CCD_ 14
因此很明显,该实例是必需的。
更改为:
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 << "Hellon"; }
std::vector<std::thread> some_threads;
};
int main()
{
foo f;
f.make_foo_func_threads();
}
相关文章:
- 如何将元素添加到数组的线程安全函数?
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- C++使用params创建线程函数会导致转换错误
- 为什么std::async使用同一个线程运行函数
- 使用 std::string () const 函数启动线程或未来
- C++线程中,没有重载函数接受 X 参数
- 如何从线程中的不同模块调用函数?
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 如何将类的成员函数传递给线程
- 是否可以创建一个从不同类调用函数的线程?
- 如何制作一个只能在一个线程上同时执行的函数?
- 启动类函数作为失去引用的线程
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- 非静态成员失败的线程调用函数
- 线程调用的函数对对象删除是否安全?
- 将类成员函数作为线程调用到另一个类成员函数时发出警告消息
- 类成员在构造函数(线程)之后更改地址
- C++无限依次运行两个函数(线程)
- c++将各种参数传递给父类构造函数(线程c++11)