2016-12-21 4 views
0

Ich versuche, eine Member-Funktion in einem eigenen Thread ausführen und gefolgt haben this post, aber in diesem Beispiel startet und endet der Thread in der gleichen Funktion. Wie pflegst du einen Verweis auf den Thread, um in einer separaten Mitgliedsfunktion (sagen wir der Destruktor) beizutreten? Ich habe dies versucht:Run-Member-Funktion im separaten Thread

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 
} 

Der Compiler mir einen Fehler gibt aber: Fehler: ungültige Initialisierung nicht konstante Referenz vom Typ ‚std :: thread &‘ aus einem R-Wert vom Typ ‚std :: thread‘. Dies liegt daran, dass ich versuche, ein temporäres Objekt an eine Referenz zu binden. Was ist der beste Weg, um das zu beheben?

+1

initialisieren würde, wenn es hat kompilieren, die 'm_read_thread' ein baumelnden Referenz wäre nach einer 'foo' aufgebaut ist. Warum hast du ein 'thread &' Mitglied anstelle eines 'threads'? – Praetorian

+1

Machen Sie 'm_read_thread' nicht zu einer Referenz. –

+0

Dies ist nicht das Problem, aber 'volatile sig_atomic_t' ist ein altes C für die Koordination zwischen dem Hauptprogramm und einem Signal-Handler. Verwenden Sie stattdessen "std :: atomic ". –

Antwort

3

foo::foo():m_read_thread(std::thread(&foo::read_thread, this)) wird nicht funktionieren, da std::thread(&foo::read_thread, this) ist ein temporärer Wert und eine temporäre kann nicht an eine non const lvalue Referenz gebunden werden.

Das besagt, dass es keinen Grund gibt, das Gewindeelement eine Referenz zu machen. Sie können einfach haben ein std::thread Mitglied wie std::thread m_read_thread; und dann im Konstruktor Sie es wie

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

yep das ist richtig und lächerlich einfach jetzt, wo ich es sehe ... –

Verwandte Themen