Ich versuche, eine ziemlich einfache Thread-Anwendung zu schreiben, aber bin neu in der Thread-Bibliothek boost. Ein einfaches Testprogramm arbeite ich an ist:(einfach) boost thread_group Frage
#include <iostream>
#include <boost/thread.hpp>
int result = 0;
boost::mutex result_mutex;
boost::thread_group g;
void threaded_function(int i)
{
for(; i < 100000; ++i) {}
{
boost::mutex::scoped_lock lock(result_mutex);
result += i;
}
}
int main(int argc, char* argv[])
{
using namespace std;
// launch three threads
boost::thread t1(threaded_function, 10);
boost::thread t2(threaded_function, 10);
boost::thread t3(threaded_function, 10);
g.add_thread(&t1);
g.add_thread(&t2);
g.add_thread(&t3);
// wait for them
g.join_all();
cout << result << endl;
return 0;
}
Allerdings, wenn ich dieses Programm, das ich eine Ausgabe von
$ ./test
300000
test: pthread_mutex_lock.c:87: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.
Aborted
erhalten kompilieren und ausführen Offensichtlich ist das Ergebnis korrekt, aber ich mache mir Sorgen über diese Fehlermeldung, vor allem weil das echte Programm, das im Wesentlichen die gleiche Struktur hat, am Punkt join_all() hängen bleibt. Kann mir jemand erklären, was passiert? Gibt es eine bessere Möglichkeit, dies zu tun, d. H. Eine Anzahl von Threads zu starten, sie in einem externen Container zu speichern und dann darauf zu warten, dass sie alle abgeschlossen sind, bevor das Programm fortgesetzt wird?
Danke für Ihre Hilfe.
Sie sollten die Auslassungszeichen zwischen der "neuen" Speicherzuweisung entfernen und an die thread_group übergeben. Andernfalls, wenn etwas in dem intervenierenden Code schief geht (d. H. Wirft), werden Sie den Thread lecken. –
Ja, das scheint der Fall zu sein und war auch die Ursache für den Fehler im größeren Programm. Das Arbeitsbeispiel verwendet jetzt: // starten Sie drei Threads g.add_thread (neue boost :: thread (thread_function, 10)); g.add_thread (neuer boost :: thread (thread_function, 10)); g.add_thread (neuer boost :: thread (thread_function, 10)); – RandomGuy
Ein guter Weg, um sicherzustellen, dass Sie nicht lecken, wäre es gewesen, std :: unique_ptr oder eine ähnliche Lösung zu verwenden und ptr.get() zu verwenden, um den Thread dem group_thread bereitzustellen. –
Klaim