2016-07-01 5 views
0

eine Klasse wie Gegeben:Std :: Thread-Member-Funktion. Soll auf Klassenfelder von diesem Zeiger zugegriffen werden?

wird
class MyClass { 
    private: 
    vector<std::string> data; 

    void threadWork(std::vector<std::string> *data_ptr) { 
    // some thread work... e.g 
    for(int i=0; i < data_ptr->size(); i++) { 
     std::string next = (*data_ptr)[i]; 
     // do stuff 
    } 
    } 

    void callThreadedFunc(int nthread) { 
    std::vector<std::thread> tgroup; 
    std::vector<std::string> data_ptr = &data; 
    for(int i=0; i < nthreads; i++) { 
    tgroup.push_back(std::thread(&myClass::threadWork, this, data_ptr)); 
    } 
    for(auto &t : tgroup) {t.join();} 
    } 
} 

this erforderlich in das Gewinde Konstruktor übergeben werden. Bedeutet dies, dass ich auf alle Klassenfelder zugreifen sollte, die Thread über this anstelle von feldspezifischen Zeigern benötigt? Zum Beispiel threadWork() sollte data Zugriff wie folgt:

void threadWork(MyClass *obj) { 
// some thread work... e.g 
    for(int i=0; i < obj->data.size(); i++) { 
    std::string next = obj.data[i]; 
    // do stuff 
    } 
} 

Antwort

3

Da threadWork ist Mitglied Funktion und Sie richtig den Thread erstellen this verwenden, können Sie alle Membervariablen der Instanz normalerweise zugreifen, keine Notwendigkeit, einen Zeiger übergeben oder Verweis auf die Daten.

Doing nur

std::thread(&myClass::threadWork, this) 

genug ist, und dann in der Thread-Funktion können Sie die Member-Variablen verwenden normalerweise:

void threadWork(/* no argument */) { 
    // some thread work... e.g 
    for(int i=0; i < data.size(); i++) { 
     std::string next = data[i]; // Uses the member variable "normally" 
     // do stuff 
    } 
} 
+1

Aber auf ein Feld in einem Zeiger vorbei ist auch gültig? Ich habe tatsächlich zwei verschiedene Vektoren und um doppelten Code zu reduzieren, gebe ich einen der beiden ein. –

+1

@izaak_pyzaak Natürlich können Sie als Argument an die Thread-Funktion alles geben, was Sie wollen, aber wenn es nicht direkt auf eine Member-Variable zugreift, würde ich vorschlagen, dass Sie die Funktion 'static' machen und dann einen Zeiger (oder eine Referenz) an die Daten, an denen die Funktion beim Erstellen des Threads anstelle von "this" arbeiten soll. –

Verwandte Themen