多线程C ++,将带有参数的函数从类传递到main

时间:2016-05-06 12:23:47

标签: c++ multithreading class pointers

我试图将带有参数的函数传递给main.cpp中的一个线程

这是我得到的错误:

"错误1错误C2064:术语不评估为采用1个参数的函数c:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ functional 1149 1 The Dining Philosophers Problem"

我似乎无法让它发挥作用。这就是我到目前为止所做的:

   Philosophers Philosopher;
   thread Philosopher_Thread[NUMBEROFPHILOSOPHERS];

   int main()
   {
            for (int Philosopher_Num = 0; Philosopher_Num < NUMBEROFPHILOSOPHERS; Philosopher_Num++)
        {
            if (Philosopher.Iterations[Philosopher_Num] > 0)
            {
                Philosopher_Thread[Philosopher_Num] = thread (std::bind(&Philosophers::Hierarchy_Function, &Philosopher_Num));  // Create threads for each philosopher
                Philosopher_Thread[Philosopher_Num].join();                                             //join threads 
            }
        }
   }

class.h

   class Philosophers
   {
   public:
    void Initialise();
    void Hierarchy_Function(int Current_Philosopher);
   }

class.cpp

   void Philosophers::Hungry_Hierarchy(int Current_Philosopher)
   {
   //code//
   }

3 个答案:

答案 0 :(得分:2)

使用std::bind时,您不需要std::thread。只做例如

std::thread(&Philosophers::Hierarchy_Function, Philosopher, Philosopher_Num);

上面还解决了另外两个问题:第一个问题是Hierarchy_Function不是static成员函数,它必须在Philosophers类的特定对象实例上调用( thread构造函数的第二个参数。第二个问题是您试图将指向整数的指针传递给函数作为参数,但该函数需要一个整数值。

此外,创建一个线程,然后立即加入该线程与仅调用该函数并按顺序进行计算没有什么不同。有两个循环,一个创建线程,然后当你完成后告诉线程退出(通过例如线程检查的一个布尔变量),然后有一个循环加入线程。

答案 1 :(得分:1)

线程创建行应为:

Philosopher_Thread[Philosopher_Num] = thread (std::bind(&Philosophers::Hierarchy_Function, &Philosopher, &Philosopher_Num));

原因是Philosophers::Hierarchy_Function是一个类成员函数。当您使用Philosopher.Hierarchy_Function(Philsopher_Num);调用此函数时,编译器会提供隐式this指针作为第一个参数。因此,当您使用指向成员函数的指针调用它时,必须将this指针显式提供为指向对象的指针。

另外需要注意的是,你在所有线程中共享同一个哲学家,这有可能导致竞争条件(你没有内部状态,所以你在上面的例子中没问题)所以要么单独一个每个线程的哲学家或提供某种形式的同步。

答案 2 :(得分:1)

因为您要绑定到非静态成员函数,所以需要提供实例指针以作为第一个变量arg进行绑定。

qt

另外我注意到你传递了一个指向Philosopher_Num的指针作为函数param,如果你打算传递迭代索引,那么这不是必需的。