【问题标题】:Run Member Function in Separate thread在单独的线程中运行成员函数
【发布时间】:2017-05-07 07:42:18
【问题描述】:

我正在尝试在其自己的线程中运行成员函数并遵循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&”类型的非常量引用无效初始化。这是因为我试图将临时绑定到引用。解决此问题的最佳方法是什么?

【问题讨论】:

  • 如果它编译了,你的m_read_thread 将在foo 构造之后成为一个悬空引用。为什么你有thread& 成员而不是thread
  • 不要将m_read_thread 用作参考。
  • 这不是问题,但volatile sig_atomic_t 是用于在主程序和信号处理程序之间进行协调的糟糕的旧 C。请改用std::atomic<bool>

标签: c++ multithreading c++11


【解决方案1】:

foo::foo():m_read_thread(std::thread(&foo::read_thread, this)) 不起作用,因为std::thread(&foo::read_thread, this) 是一个临时值,并且一个临时值不能绑定到非 const 左值引用。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 2013-03-22
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    相关资源
    最近更新 更多