2016-07-04 18 views
-1

Ich habe an einer ziemlich einfachen Einrichtung gearbeitet: einem gleichzeitigen Schleifenkonstrukt, das eine Liste von Eingabeelementen, einen Ausgabevektor und eine Funktion zur Berechnung der Ausgabe übernimmt Elemente aus Eingabeelementen.Kein passender Konstruktor für die Initialisierung von 'std :: thread'

Ich habe diesen Schnipsel, die nicht kompilieren lassen:

  template<class In, class Out> 
      void thread_do(net::coderodde::concurrent::queue<In>& input_queue, 
          Out (*process)(In in), 
          std::vector<Out>& output_vector) 
      { 
       // Pop the queue, process, and save result. 
       ... 
      } 


       for (unsigned i = 0; i < thread_count; ++i) 
       { 
        thread_vector.push_back(std::thread(thread_do, 
                 input_queue, 
                 process, 
                 output_vector)); 
       } 

Ich benutze -std=c++14.

 

./concurrent.h:129:45: error: no matching constructor for initialization of 'std::thread' 
        thread_vector.push_back(std::thread(thread_do, 
              ^   ~~~~~~~~~~ 
 

Allerdings habe ich keine Ahnung, wie es zu beheben ist. Versucht, prepend & zum thread_do/<In, Out> anhängt, noch nicht in Anspruch nehmen.

+1

thread_do ist sowohl eine Template-Funktion und eine Klassenmethode. Der Konstruktor von std :: thread muss dies widerspiegeln. –

+0

Woah, _way_ zu viel Code. Wo ist der [MCVE], mit dem Sie diesen Monat bisher debuggen? –

+0

_ "Allerdings habe ich keine Ahnung, wie es zu beheben. Versucht, & thread_do/appending voranzustellen, noch keine zu nutzen." _ Sie könnten versuchen, die Dokumentation zu lesen, die eigentlich Ihr erster Schritt statt wild sein sollte Raten. –

Antwort

1

Sie benötigen eine Funktion instanziiert:

thread_vector.push_back(std::thread(thread_do<In, Out>,  // you need to instantiate your template function 
            std::ref(input_queue), // pass parameters by ref 
            std::ref(process),  // - // - 
            std::ref(output_vector))// - // - 
            ); 
4

Dieses minimale, vollständige Beispiel (Hinweis) zeigt Ihnen, wie Sie eine Template-Member-Funktion in einem anderen Thread aufrufen.

#include <thread> 

struct X 
{ 

    template<class A, class B> void run(A a, B b) 
    { 
    } 

    template<class A, class B> 
    void run_with(A a, B b) 
    { 
    mythread = std::thread(&X::run<A, B>, this, a, b); 
    } 

    std::thread mythread; 
}; 

int main() 
{ 
    X x; 
    x.run_with(10, 12); 
    x.mythread.join(); 
} 

Beachten Sie, dass std::thread ‚s Konstruktor Auto-deduce Vorlage Argumente nicht in der Lage ist. Du musst explizit sein.

Verwandte Themen