在单独的线程中运行成员函数

时间:2016-12-21 19:15:13

标签: c++ multithreading c++11

我正在尝试在自己的线程中运行成员函数并且已经跟随this post,但是在该示例中,线程在同一函数中启动并结束。如何维护对线程的引用以加入单独的成员函数(比如析构函数)?我试过这个:

class foo
{
    foo();
    ~foo();
    volatile sig_atomic_t m_run_thread = true;
    std::thread &m_read_thread;
    void read_thread();

}

foo::foo():m_read_thread(std::thread(&foo::read_thread, this))
{
}

foo::~foo()
{
     m_run_thread = false;
     m_read_thread.join();
}

void foo::read_thread()
{
    while(m_run_thread)
    {
    //do something cool
    }
}

int main()
{
   foo bar;
   //do other stuff
}

编译器给出了一个错误:错误:从'std :: thread'类型的右值开始,无效初始化'std :: thread&'类型的非const引用。这是因为我试图将临时绑定到引用。这是解决这个问题的最好办法吗?

1 个答案:

答案 0 :(得分:3)

foo::foo():m_read_thread(std::thread(&foo::read_thread, this))不起作用,因为std::thread(&foo::read_thread, this)是临时值,临时值不​​能绑定到非常量左值引用。

那说没有理由让线程成员成为引用。您可以简单地拥有std::thread成员std::thread m_read_thread;,然后在构造函数中初始化它就像

foo::foo() : m_read_thread(std::thread(&foo::read_thread, this))