在构造函数上启动线程时调用不匹配

No match for call while launching thread on constructor

我有一个 class Foo,它必须在构造函数上启动一个线程(这是我 class 上的一个方法 loop())。

我的class头文件是这样的:

class Foo
{
public:
  Foo();
  ~Foo();
private
  void loop();

  std::thread m_thread;

  //more stuff.
}

源文件是:

Foo::Foo()
{
   m_thread(&Foo::loop, Foo()); // <---- No match for call '(std::thread) (void (Foo::*)(), Foo)'
   m_thread.join();
}

Foo::~Foo()
{
  m_thread.kill(); // <---- ??? how to do this?
}

void Foo::loop()
{
   while()
   {
       //do stuff.
   }
}

问题:

1 - 如何修复 Foo constructor 上的错误?编译时出现 "no match for call" 错误。

加分题:

2 - 如何在对象的析构函数中终止线程?

1) 您正在尝试 调用 一个线程对象,而不是在此处对其进行初始化:

m_thread(&Foo::loop, Foo());

您应该设置并为其分配适当的值:

m_thread = std::thread(&Foo::loop, Foo());

但这将默认构造另一个 Foo 对象,它将启动一个线程,这将默认构造一个 Foo 对象,它将启动一个线程,它将...

所以,也许您的意思是在实例本身上启动线程,在这种情况下您需要

m_thread = std::thread(&Foo::loop, this);

注意通常在构造函数初始化列表中初始化数据成员比较好,但是由于线程调用了Foo的成员,所以最好launch一旦对象被构造出来。

2)可以在析构函数中加入线程。只要确保没有异常传播出析构函数即可。

您还可以像这样在构造函数初始化列表中定义 m_thread 对象:

Foo::Foo() : m_thread(&Foo::loop, this), End(false)
{
   m_thread.join();
}

结束线程的一个简单方法是使用成员变量 End,在构造函数中将其设置为 true 并在线程中循环

Foo::~Foo()
{
    End = true;
    m_thread.join(); // <---- ??? how to do this?
}

void Foo::loop(Foo* This)
{
   while(This->End == false)
   {
      /*Do something*/
   }
}