Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用同一类中的函数在类内创建线程_C++_Multithreading_C++11 - Fatal编程技术网

C++ 使用同一类中的函数在类内创建线程

C++ 使用同一类中的函数在类内创建线程,c++,multithreading,c++11,C++,Multithreading,C++11,我希望能够定义一个包含一些数据成员的类,以及一个可以访问这些数据成员的函数,这些数据成员是私有的 然后我需要一个公共函数,它创建一些线程,这些线程对类的数据成员进行操作。我在编译代码时遇到了一些问题 不要担心互斥或数据保护,这不会成为问题,因为这只是一些用于测试的示例代码 class foo { public: void make_foo_func_threads(); private: void foo_func(); char private_da

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

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

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

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();
}
class-foo{
公众:
void make_foo_func_threads();
私人:
void foo_func();
字符数据;
std::vector一些线程;
}
void foo::foo_func(){
而(1){
私有_数据='A';
}
}
void foo::make_foo_func_thread(){
对于(…)一些线程。向后推(std::thread(foo_func));
对于(…)某些_线程。join();
}
编译器给了我一个错误:

'没有对std::thread::thread()的匹配调用'

显然,参数1从
void(foo::*&&&)没有已知的转换。

呃,是的,我不知道这意味着什么,除了编译器在理解如何解析foo_func方面遇到了困难-我想


我怎样才能帮助编译器理解我要做的事情,这样就不会再有错误了。毫无疑问,我写的代码是不合法的,如果是这样的话,有人能向我解释一下为什么会这样。谢谢

foo_func
是一个(非
静态
)成员函数,它需要一个
foo
的实例进行操作。必须将此实例提供给线程构造函数。如果您参考参考页面,它将解释在新线程中执行的代码。相关点是指
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));
:

#包括
#包括
#包括
福班
{
公众:
void make_foo_func_线程()
{
对于(int i=0;i<5;++i)
一些线程。向后推(std::thread(&foo::foo_func,this));
对于(自动&t:某些_线程)t.join();
}
私人:

void foo_func(){std::cout好的,那太好了!但是有一个问题,我的程序从main的底部掉了出来,即使应该有一个无限循环在运行。thread.join()也是如此似乎没有等待线程加入!@EdwardBird,你能将完整的程序发布到stacked crooked或类似的站点并发布一个链接吗?或者更好的是,发布另一个问题以获得其他人的贡献(这个答案和另一个答案已按发布的方式解决了问题)。哦,不,我的错,我没有放f。make_foo_func_threads();总而言之!很抱歉,它很好,大家不要惊慌!>。谢谢这个答案节省了我的时间,但我脑海中出现了一个简单的问题,为什么我们在线程中使用类指针或
这个
?我的意思是=
一些线程。推回(std::thread(&foo::foo\u 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();
}