线程调用类函数错误

时间:2015-12-05 16:13:30

标签: c++ multithreading

所以我在这里有一些新的线程,而且我有一个具有函数的类,我不能同时运行4次。它需要两个参数,但是对于4次中的每一次,发送的参数与另一个不同。 这是主要的:

int main()
{

MicroProcessor Cpu;
Cpu.Run_core1();

thread t1(Cpu.Run_core2);
thread t2(Cpu.Run_core3);
thread t3(Cpu.Run_core4);



t1.join();
t2.join();
t3.join();

cout << "Simulation done.\n";
return 0;
}

我基本上想要做的是使用主线程执行4个任务之一,然后使用其余三个线程的三个线程。但是,声明这些线程会打印出这个错误:

  

IntelliSense:function&#34; std :: thread :: thread(const std :: thread&amp;)&#34;   (在&#34的第70行声明; C:\ Program Files(x86)\ Microsoft Visual   Studio 12.0 \ VC \ include \ thread&#34;)无法引用 - 它是一个   已删除的功能

以下是MicroProcessor类,以备不时之需:

class MicroProcessor
{
public:
    MicroProcessor();

    void Run_core1();
    void Run_core2();
    void Run_core3();
    void Run_core4();

    void Run(std::ifstream&, I_mem&);
    ~MicroProcessor();

private:
    std::ifstream in1, in2, in3, in4;
    I_mem insts1, insts2, insts3, insts4;
    D_mem data;

};
#endif

Run_core()函数唯一能做的就是使用各自的参数调用Run函数。

PS:I_mem是另一个用户定义的类。

对不起,很长的帖子! 谢谢:))

1 个答案:

答案 0 :(得分:1)

您正在尝试将指向该方法的指针传递给线程对象(实际上您有语法错误,但我有您的意图)。它无法工作 - 它需要一个相关的对象。您可以使用std::bind创建一个callable,然后将其传递给std::thread对象,如下所示:

thread t1(std::bind(&Cpu::Run_core2, &Cpu));

或者,您也可以使用lambda函数:

thread t1([&Cpu]{Cpu.Run_core2();}));

或者,最好的方法是使用另一个std :: thread ctor:

thread t1(&Cpu::Run_core2, &Cpu);

对其他操作进行相同的操作,这应该有效。