2013-07-04 10 views
10

Ich möchte in der Lage sein, eine Klasse mit einigen Datenelementen zu definieren, und eine Funktion, die Zugriff auf diese Datenelemente hat, die privat sein sollen.Create Thread innerhalb der Klasse mit Funktion aus der gleichen Klasse

Ich möchte dann eine öffentliche Funktion, die einige Threads erstellt, die für die Datenmitglieder der Klasse arbeiten. Ich habe Probleme, meinen Code kompilieren zu lassen.

Mach dir keine Sorgen über Mutex oder Datenschutz, dies wird kein Problem sein, da dies nur ein Beispielcode zum Testen ist.

class foo { 
    public: 
    void make_foo_func_threads(); 

    private: 
    void foo_func(); 

    char private_data; 
    std::vector<std::thread> some_threads; 
} 

void foo::foo_func() { 
    while(1) { 
     private_data = 'A'; 
    } 
} 

void foo::make_foo_func_thread() { 
    for(...) some_threads.push_back(std::thread(foo_func)); 
    for(...) some_threads.join(); 
} 

Der Compiler mir den Fehler geben:

'no matching call to std::thread::thread()'

Anscheinend gibt es ‚keine bekannte Umwandlung für Argument 1 von <unresolved overloaded function type> zu void (foo::*&&)'.

Erm, ja, ich habe keine Ahnung, was das bedeutet, abgesehen von dem Compiler hat Probleme zu verstehen, wie foo_func zu lösen - ich denke.

Wie kann ich dem Compiler helfen zu verstehen, was ich versuche zu tun, damit es mich nicht mit weiteren Fehlern belästigt. Zweifellos ist der Code, den ich geschrieben habe, nicht legal, und wenn das der Fall ist, könnte jemand erklären, warum das der Fall für mich ist. Vielen Dank!

Antwort

11

foo_func ist eine (nicht static) Mitgliedsfunktion, und es muss eine Instanz von foo auf die zu arbeiten. Diese Instanz muss dem Thread-Konstruktor bereitgestellt werden. Wenn Sie auf die Referenzseite std::thread::thread verweisen, wird erläutert, welcher Code im neuen Thread ausgeführt wird. Die relevanten Punkt ist, dass die zu f bezieht sich ein Zeiger auf Elementfunktion ist durch:

  • If f is pointer to a member function of class T , then it is called. The return value is ignored. Effectively, the following code is executed:
    • (t1.*f)(t2, ..., tN) if the type of t1 is either T , reference to T or reference to type derived from T .
    • ((*t1).*f)(t2, ..., tN) otherwise.

so ist es klar, dass die Instanz erforderlich ist.

Wechseln zu:

for(...) some_threads.push_back(std::thread(&foo::foo_func, this)); 

Simple example:

#include <iostream> 
#include <thread> 
#include <vector> 

class foo 
{ 
public: 
    void make_foo_func_threads() 
    { 
     for (int i = 0; i < 5; ++i) 
      some_threads.push_back(std::thread(&foo::foo_func, this)); 
     for (auto& t: some_threads) t.join(); 
    } 

private: 
    void foo_func() { std::cout << "Hello\n"; } 
    std::vector<std::thread> some_threads; 
}; 

int main() 
{ 
    foo f; 
    f.make_foo_func_threads(); 
} 
+0

Okay, das ist großartig! Ein Problem allerdings, mein Programm fällt aus dem unteren Bereich von main, obwohl es eine Endlosschleife geben soll. thread.join() scheint nicht darauf zu warten, dass die Threads beitreten! – user3728501

+0

@EdwardBird, könnten Sie das vollständige Programm zu stacked-krumm oder ähnlichem posten und einen Link posten? Oder besser, posten Sie eine andere Frage, um den Beitrag anderer Leute zu bekommen (und diese Antwort, und die andere, haben die gestellte Frage angesprochen). – hmjd

+2

Hoppla, nein mein Schlechter habe ich nicht gestellt f.make_foo_func_threads(); Hauptsächlich! Tut mir leid, es funktioniert gut, alle DONT PANIC! >. < – user3728501

Verwandte Themen