使用来自同一类的函数在类内创建线程

Create thread inside class with function from same class

本文关键字:函数 线程 创建 一类      更新时间:2023-10-16

我希望能够定义一个具有一些数据成员的类,以及一个可以访问这些数据成员的函数,这些数据成员是私有的。

然后我想要一个公共函数,它创建一些线程,这些线程对类的数据成员进行操作。我在编译代码时遇到了一些问题。

不要担心互斥或数据保护,这不会是一个问题,因为这只是一些用于测试的示例代码。

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();
}