2016-12-21 5 views
0

自分のスレッドでメンバー関数を実行しようとしていて、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 
} 

コンパイラはしかし私にエラーを与える:エラー:タイプの非const参照の無効な初期化「のstd ::スレッド&を」タイプ「のstd ::スレッド」は右辺値から。これは、一時的に参照にバインドしようとしているために発生します。これを修正する最も良い方法は何ですか?

+1

のようにそれを初期化します。なぜあなたは 'スレッド 'の代わりに'スレッド& 'メンバーを持っていますか? – Praetorian

+1

'm_read_thread'を参照しないでください。 –

+0

これは問題ではありませんが、 'volatile sig_atomic_t'は、メインプログラムとシグナルハンドラを調整するために非常に古いものです。代わりに 'std :: atomic 'を使用してください。 –

答えて

3

foo::foo():m_read_thread(std::thread(&foo::read_thread, this))std::thread(&foo::read_thread, this)は一時的な値であり、一時的な値は非const値の参照にバインドできません。

スレッドメンバーを参照にする理由はないと言われています。あなたはシンプルでstd::thread m_read_thread;ようstd::threadメンバーを持つことができ、その後、コンストラクタで、あなたはそれをコンパイルしなかった場合は、 `foo`が構築された後、あなたの` m_read_thread`はダングリングリファレンスだろう

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

これは正しいと私はそれを見るとばかげて単純です... –

関連する問題