2016-04-24 5 views
1

Ich habe eine harte Zeit rufen Sie die richtige Syntax für den Aufruf einer Elementfunktion der Klasse in separaten Thread zu bekommen. Keine der drei Optionen funktioniert. Zeile 1 und 2 verursachen einen Kompilierzeitfehler, während der dritte einen Laufzeitfehler anzeigt. Kann mir bitte jemand sagen was der richtige Weg ist.Nicht in der Lage Klasse Member-Funktion in einem separaten Thread unter Verwendung von C++ 11 Thread-Klasse

#include <iostream> 
#include <thread> 
#include <mutex> 
using namespace std; 
struct Complex 
{ 
    mutex mx; 
    int i; 
    Complex(int q) : i(q) {} 
    void mul(int x) 
    { 
     lock_guard<mutex> lock(mx); 
     int z = i*x; 
     cout<<z<<endl; 
    } 
    void div(int x) 
    { 
     lock_guard<mutex> lock(mx); 
     int z = i/x; 
     cout<<z<<endl; 
    } 
    void both(int x, int y) 
    { 
     mul(x); 
     div(y); 
    } 
}; 
int main() 
{ 
    //Complex complex(9); 
    //thread t(&Complex::both,&Complex(9),32, 23);  --1 
    //thread t(&Complex::both,complex,32,23);   --2 
    //thread t(&Complex::both,&complex,32,23);   --3 
    return 0; 
} 

Antwort

4

(1) nicht funktioniert, weil der Ausdruck &Complex(9) ist schlecht ausgebildet - Sie versuchen, die Adresse eines temporären zu nehmen und das nicht erlaubt ist.

(2) funktioniert nicht, weil std::thread wird alle Argumente intern kopieren. Der Kopierkonstruktor complex ist als gelöscht definiert, da er ein Element vom Typ std::mutex enthält, dessen copy constructor gelöscht wird.

(3) in Ordnung, aber kompiliert wird zur Laufzeit fehlschlagen, weil der erzeugte Thread t zerstört werden, bevor er verbunden wird. Sie wollen join es zuerst:

std::thread t(&Complex::both, &complex, 32, 32); 
t.join(); 
+0

Nun, das ist perfekt. Vielen Dank für Ihre Antwort ! – user3798283

+0

Die 'std :: ref'-Version hängt von einem [kürzlich behobenen LWG-Problem] (http://cplusplus.github.io/LWG/lwg-defects.html#2219) ab und funktioniert in einigen Implementierungen möglicherweise nicht. –

+0

@ T.C. Ich werde es einfach entfernen. Ich wusste nicht, dass das "Ref" Zeug so kompliziert war ... Danke! – Barry

Verwandte Themen