Ich programmiere in C ++, aber ich benutze nur pthread.h, keine Boost oder C ++ 11 Threads.
Also versuche ich Threads zu verwenden, aber basierend auf einer meiner vorherigen Fragen (link) , das scheint nicht machbar, da Threads direkt nach Abschluss der Aufgabe beendet werden. Einer der häufigsten Gründe für die Verwendung einer Threadpoolimplementierung ist die Reduzierung des Thread-Erstellungsaufwands durch Wiederverwendung dieser Threads für mehrere Aufgaben.
Das ist der einzige andere Weg, dies in C zu implementieren, um fork () zu verwenden und um eine Pipe vom Hauptprozess zum untergeordneten Prozess zu erstellen? Oder gibt es eine Möglichkeit, eine Verbindung zwischen Threads und deren Eltern, die ich nicht kenne, einzurichten?
Vielen Dank im Voraus!
Ja, Sie können ein Thread-sicher erstellen Warteschlange zwischen den Threads. Dann werden die Threads im Pool in einer Schleife sitzen und ein Element aus der Warteschlange abrufen, alles ausführen, was es benötigt, und dann zurückgehen und ein anderes erhalten.
Das ist in C ++ in der Regel ein wenig einfacher / einfacher, weil es etwas einfacher ist, sich auf einige der Schnittstellen zu einigen (zB overload operator()
, um den Code für eine Aufgabe auszuführen), aber auf einer fundamentalen Ebene können Sie alle Gleiche Dinge in C (zB enthält jede task
struct, die Sie in die Queue legen, einen Zeiger auf eine Funktion, um die Arbeit für diese Aufgabe auszuführen).
In Ihrem Fall ist es wahrscheinlich einfacher, eine Überladung von operator()
zu verwenden, da Sie C ++ verwenden. Der Rest von task
struct (oder wie auch immer Sie ihn nennen) enthält alle benötigten Daten usw.
Aus dem POSIX-Standard :
%Vor%(...) Der Thread wird erstellt, indem
start_routine
mitarg
als einziges Argument ausgeführt wird.
Sie sollten also eine Reihe von Threads mit dieser Funktion erstellen und sie alle ausführen lassen, etwa
%Vor% (Drücken Sie am Ende der Eingabe die Elemente n STOP_WORKING
in die Warteschlange, wobei n die Anzahl der Threads ist.)
Wohlgemerkt, pthreads ist eine sehr Low-Level-API, die sehr wenig Typ-Sicherheit bietet (alle Daten werden als void
-Zeiger übergeben). Wenn Sie versuchen, CPU-intensive Aufgaben zu parallelisieren, sollten Sie sich stattdessen OpenMP ansehen.
Sie können es hilfreich finden, den Quellcode für libdispatch zu lesen die Grundlage für Apples Grand Central Dispatch und verwendet Thread-Pools.
'scheint nicht durchführbar, da die Threads direkt nach der Beendigung ihrer Aufgabe enden.' Was ??
%Vor%.. niemals etwas zurückgeben, tatsächlich niemals zurückkehren.
Ich würde vorschlagen, Threaded Building Blocks von Intel zu verwenden, um Work-Queue / Threadpool-ähnliche Aufgaben zu erledigen. Ein ziemlich konstruiertes Beispiel mit TBB 3.0:
%Vor%Wird später wie folgt verwendet:
%Vor%Ich habe Google vor ein paar Monaten verwendet, Sie sollten es versuchen.
Bearbeiten: Es scheint, dass du vielleicht eine Gruppe willst. Ich war in der Lage, einen mit einigen geringfügigen Abänderungen des oben genannten zu schaffen, so dass der Arbeiter keine Arbeit ausführte, sondern sich nur den Fäden anschloss.
Tags und Links c c++ pthreads threadpool