2016-06-30 7 views
18

Ich möchte eine Sammlung von Threads in einem Vektor speichern, und schließe sie alle vor dem Beenden meines Programms. Ich erhalte die folgende Fehlermeldung beim Versuch, den ersten Thread egal zu verbinden, wie viele ich in der Sammlung platzieren:Threads in einem Vektor können nicht verbunden werden

system_error: thread::join failed: No such process 

Hier ist einigen einfachen Code, der mein Problem zeigt:

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

using std::cout; 
using std::endl; 
using std::vector; 
using std::thread; 
using std::mem_fn; 

int main() 
{ 
    vector<thread> threads(1); 
    threads.push_back(thread([]{ cout << "Hello" << endl; })); 
    for_each(threads.begin(), threads.end(), mem_fn(&thread::join)); 

    // also tried --> for(thread &t : threads) t.join() 
} 

Und ich bin Gebäude es die folgende (versucht Klirren ++ 4.2.1 und g ++ 5.3.1) mit:

g++ -o src/thread_test.o -c -std=c++14 src/thread_test.cpp -pthread 
g++ -o thread_test src/thread_test.o -pthread 

ich sehe viele Beispiele nur diese um das Internet zu tun. Hat sich im Vertrag von <thread> oder <vector> etwas geändert, das diese Beispiele außer Kraft gesetzt hat?

HINWEIS: Als eine Nebensache für zukünftige Leser, fügte ich das Hinzufügen des Konstruktorarguments nach dem Versuch {} Assignment, die aufgrund einer privaten Kopie Konstruktor fehlschlägt. Bei dem Versuch, den Kopierkonstruktor zu vermeiden, habe ich am Ende uninitialisierte Threads zugewiesen - unvorsichtiger Fehler.

+1

Verwenden Sie bitte die '-pthread'-Compiler-Flags für das Kompilieren und Verknüpfen der Stufe, anstatt' -lpthread 'zu verknüpfen. –

+0

Ich benutze Scons, also formatiert es meine Bibliothekargumente für mich. Es funktioniert tatsächlich ohne entweder -thread oder -lpthread und ich hatte es nur hinzugefügt, um sicherzustellen, dass ich einige Implementierungsdetails während meiner Probleme nicht vermisste. Also 1) Ich denke, dass der Compiler diese Flags für mich stillschweigend hinzufügt, und 2) warum ist die Nicht-Standard-Bibliothek vorzuziehen? –

+3

'-lpthread' ist eine direkte Anfrage an den Linker, während '-pthread' eine Option ist, die vom Compiler-Treiber interpretiert wird. Wenn Sie "-pthread" konsistent sowohl zur Kompilier- als auch zur Verknüpfungszeit verwenden, gibt das dem Compilertreiber die Möglichkeit, alles zu tun, was erforderlich sein kann, abgesehen von der Verknüpfung in libpthread, um ein Multithread-fähiges Programm zu erstellen. Allerdings bin ich nicht über ein System gestolpert, bei dem in vielen Jahren noch etwas anderes nötig war. – zwol

Antwort

33

vector<thread> threads(1);

Dies erzeugt einen Faden, der an dem Index 0 zugegriffen werden kann.

threads.push_back(thread([]{ cout << "Hello" << endl; }));

dies ein zweites Gewinde fügt die 1 bei Index zugegriffen werden kann.

for_each(threads.begin(), threads.end(), mem_fn(&thread::join));

Das wird join auf beiden thread Objekte nennen. Der erste wurde jedoch nie gestartet, daher ist er nicht teilbar.

Stattdessen können Sie vector<thread> threads(1); durch vector<thread> threads; threads.reserve(1); ersetzen und weiterhin push_back verwenden.

Verwandte Themen