2016-12-21 3 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 
} 

Компилятор дает мне ошибку, хотя: ошибка: недопустимую инициализации неконстантного ссылки типа «станд :: нить &» от RValue типа "станд :: нить. Это вызвано тем, что я пытаюсь привязать временную ссылку. Что это лучший способ исправить это?

+1

Если она компилировать ваш 'm_read_thread' будет оборванная ссылкой после' Foo' построен. Почему у вас есть 'thread &' member вместо 'thread'? – 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) временное значение и временное не может быть связано с не сопзЬ Lvalue ссылки.

Это говорит о том, что нет причин сделать ссылку на поток членом. Вы можете просто иметь std::thread член как std::thread m_read_thread;, а затем в конструкторе вы инициализировать его как

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

Да, это правильно и смешно просто, когда я вижу это ... –

Смежные вопросы