2016-05-06 88 views
1

我试图通过与参数的函数形成一类到一个线程在main.cpp中多线程C++,从一类传递函数用参数到主

这是错误我'm得到:

“错误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// 
    } 
+1

你在使用'std :: thread'吗? – erip

+0

疯狂的猜测 - 该功能需要一个对象,尝试添加一个静态关键字(尽管编译器消息建议别的东西,我不会对这些信任很多) – hauron

+0

是的,我是。@erup –

回答

2

使用std::thread当你不需要std::bind。只要做

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

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

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

1

线程创建行应为:

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

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

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

1

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

Philosophers Philosopher; 
thread Philosopher_Thread[NUMBEROFPHILOSOPHERS]; 

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

而且我注意到你传递一个指针到Philosopher_Num作为功能PARAM,如果你打算通过反复索引,那么这是没有必要的。