Wie soll ein Thread-Pool in C implementiert werden?

8

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!

    
K-RAN 04.05.2012, 15:42
quelle

6 Antworten

6

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.

    
Jerry Coffin 04.05.2012, 15:47
quelle
3

Aus dem POSIX-Standard :

%Vor%
  

(...) Der Thread wird erstellt, indem start_routine mit arg 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.

    
Fred Foo 04.05.2012 15:46
quelle
2

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.

    
Caleb 04.05.2012 16:00
quelle
2

'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.

    
Martin James 04.05.2012 15:51
quelle
1

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%     
user7116 04.05.2012 16:08
quelle
-1

Ссылка

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.

    
Crazy Eddie 04.05.2012 15:55
quelle

Tags und Links