Wie verwende ich einen Thread-Pool mit pthreads?

Lesezeit: 2 Minuten

Benutzer-Avatar
Pithikos

Ich habe eine Warteschlange mit Jobs und möchte einen Pool von vier Threads erstellen, auf die ich meine Jobs werfen kann. Woran ich feststecke, ist, wie ich die Threads erstellen und sie suspendieren lassen kann, während es keine Arbeit gibt.

JOB QUEUE        | job1 | job2 | job3 | job4 | ..

THREAD POOL      | thread1 | thread2 | thread3 | thread4 |

Um die Threads zu erstellen, die ich derzeit am Initialisierungspunkt habe:

for (t=0; t<num_of_threads; t++){
    pthread_create(&(threads
}

Wo num_of_threads=4 und doSth2 ist eine Funktion mit nichts drin. Also sobald ich die 4 Threads erstellt habe und sie fertig sind doSth2wie kann ich ihnen neue Aufgaben geben, ohne sie zu töten?

Der Schlüssel zu einem Thread-Pool ist eine Warteschlange. Hier sind modifizierte Funktionen für einen Thread-Pool, den ich entwickelt habe.

Element in Warteschlange stellen

void queue_add(queue q, void *value)
{
    pthread_mutex_lock(&q->mtx);

    /* Add element normally. */

    pthread_mutex_unlock(&q->mtx);

    /* Signal waiting threads. */
    pthread_cond_signal(&q->cond);
}

Element aus Warteschlange holen

void queue_get(queue q, void **val_r)
{
    pthread_mutex_lock(&q->mtx);

    /* Wait for element to become available. */
    while (empty(q))
        rc = pthread_cond_wait(&q->cond, &q->mtx);

    /* We have an element. Pop it normally and return it in val_r. */

    pthread_mutex_unlock(&q->mtx);
}

  • Vielen Dank. Ich habe jetzt die Idee. Jeder Thread im Pool soll seriell aus der Warteschlange lesen. Aber wie gehen Sie vor, wenn die Threads angehalten werden, wenn die Warteschlange leer ist, damit sie die CPU nicht auffressen?

    – Pithikos

    5. August 2011 um 10:16 Uhr


  • @Pithikos pthread_cond_wait blockiert, bis jemand (queue_add) Signale cond.

    – Cnicutar

    5. August 2011 um 10:17 Uhr

  • Tut mir leid, dies so spät zu öffnen, aber wenn der queue_get den mtx sperrt und dann eine Schleife durchläuft, wie können Sie dann ein Element hinzufügen, wenn mtx gesperrt ist? Sollte das Schloss nicht sein nach die Schleife (zB loop -> lock -> pop -> unlock)?

    – Alexandre Gomes

    22. Oktober 2014 um 19:44 Uhr

  • Vor einiger Zeit weiß ich – um @AlexandreGomes zu antworten – pthread_cond_wait (von man [linux.die.net/man/3/pthread_cond_wait]) entsperrt den Mutex, während er auf die Verwendung durch andere Threads wartet, und kehrt zurück, nachdem er wieder gesperrt wurde. Daher wird der Mutex als Parameter übergeben.

    – Benommen

    11. Januar 2016 um 12:00 Uhr

Als alternatives Riff auf Cnicutars Antwort können Sie einfach verwenden POSIX-Nachrichtenwarteschlangen die sich um die Synchronisationsbelange im Kernel kümmert. Für die Systemaufrufe wird es einen kleinen Overhead geben, der von Bedeutung sein kann oder auch nicht. Es ist ziemlich minimal, da der Kernel alles erledigt, was Sie sowieso manuell tun müssten.

Die Consumer-Threads können einfach blockieren mq_receive und wenn Sie eine spezielle Art von Warteschlangennachricht erstellen, können Sie den Threads leicht mitteilen, wann sie beendet werden sollen.

1335100cookie-checkWie verwende ich einen Thread-Pool mit pthreads?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy