2016-10-22 3 views
0

Hey :) es ist nicht wirklich ein praktisches Beispiel. Es ist nur ein paar Dinge zu testen.Mehrere unendliche Threads

Die Threads sollen unabhängige Eingabeobjekte darstellen, die nach dem Zufallsprinzip Daten erzeugen und diese Daten an ein anderes Empfängerobjekt senden.

Mein Problem ist, dass ich möchte, dass sie Daten für eine unendliche Zeit erstellen. Aber wenn ich den ersten Thread starte, bleibt er wegen der While-Schleife hängen.

Wie ist es möglich, mehrere unendliche Threads zu starten?

Klasse A:

#pragma once 

#include <iostream> 
#include <thread> 

class A 
{ 

public: 

    A()  : m_ID(-1) {} 
    A(int _ID) : m_ID(_ID) {} 
    ~A()     {} 

public: 

    void DoWork() 
    { 
     std::thread T(&A::Work, this); 

     T.join(); 
    } 

private: 

    void Work() 
    { 
     while (true) 
     { 
      // do stuff 
      std::cout << m_ID << "\n"; 
     } 
    } 

private: 

    int m_ID; 

}; 

main.cpp:

#include "A.h" 

static const unsigned int s_NumberOfObjects = 5; 

void main() 
{ 
    A As[s_NumberOfObjects]; 

    for (size_t i = 0; i < s_NumberOfObjects; i++) 
    { 
     As[i] = A(i); 
    } 


    for (size_t i = 0; i < s_NumberOfObjects; i++) 
    { 
     As[i].DoWork(); 
    } 
} 
+0

Entfernen Sie die Zeile 'T.join();' aus 'A :: DoWork()' – Leon

+0

dann bekomme ich den Fehler: R6010 - abort() wurde – Chris

+1

aufgerufen Setzen Sie stattdessen eine 'T.detach()'. – Leon

Antwort

1

der Faden ein Mitglied variabel machen, und bewegen Sie die join Funktion A destructor

class A{ 
    /* ... */ 

public: 
    ~A() { m_Worker.join(); } 

/*...*/ 
void DoWork() 
{ 
    m_Worker = std::thread(&A::Work, this); 
} 

private: 
    int m_ID; 
    std::thread m_Worker; 

}; 

detach verwendet, ist sehr entmutigt, wenn Sie alle Spur für den Thread verlieren und Sie haben kein wa y, dass es sauber beendet wird, wenn die Anwendung beendet wird.

+0

funktioniert nicht für mich. VisualStudio sagt mir, dass die Funktion operator = für std :: thread eine gelöschte Funktion ist – Chris

+0

Welche Version von Visual Studio arbeiten Sie? –

+0

Visual Studio Professional 2013 – Chris