2016-12-21 69 views
0

我試圖在其自己的線程中運行成員函數,並且遵循this post,但是在該示例中,該線程在相同函數中啓動並結束。你如何保持對線程的引用來加入單獨的成員函數(比如析構函數)?從類型「的std ::線程」的右值的類型「的std ::線程&」的非const引用無效初始化:我已經試過這樣:在單獨的線程中運行成員函數

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 
} 

編譯器雖然給我一個錯誤:錯誤。這是因爲我試圖將臨時綁定到引用。什麼是解決這個問題的最好方法?

+1

如果它沒有編譯,你的'm_read_thread'將成爲懸空參考'foo'建成後。爲什麼你有'線程'而不是'線程'成員? – Praetorian

+1

不要將'm_read_thread'作爲參考。 –

+0

這不是問題,但'volatile sig_atomic_t'是重要的C語言,用於在主程序和信號處理程序之間進行協調。改爲使用'std :: atomic '。 –

回答

3

foo::foo():m_read_thread(std::thread(&foo::read_thread, this))不會工作,因爲std::thread(&foo::read_thread, this)是一個臨時值,臨時值不​​能綁定到非常量左值引用。

這就是說沒有理由讓線程成員參考。你可以簡單的有像std::thread m_read_thread;一個std::thread成員,然後在構造函數中,你會初始化它像

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

是的,現在我看到它是正確和可笑的簡單... –