Aufgabenwarteschlangen für C++: Überblick über Bibliotheken und Implementierung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Aufgabenwarteschlangen für C++: Vollständiger Leitfaden zur Auswahl und Implementierung



In der modernen C++-Programmierung ist die effiziente Nutzung von Multithreading der Schlüssel zur Anwendungsleistung. Eines der wichtigsten Muster ist die Aufgabenwarteschlange (task queue), die es ermöglicht, Arbeit auf Threads zu verteilen, ohne deren Lebenszyklus manuell verwalten zu müssen. In diesem Artikel analysieren wir die besten Bibliotheken für C++, die fertige Lösungen bieten, und zeigen, wie Sie eine Aufgabenwarteschlange selbst implementieren können.



Was ist eine Aufgabenwarteschlange und warum wird sie benötigt



Eine Aufgabenwarteschlange ist ein Mechanismus, bei dem Sie „Aufgaben“ (Funktionen, Lambdas oder Objekte) in eine Warteschlange einfügen, und ein Thread-Pool führt sie automatisch aus. Dies vermeidet die Notwendigkeit, Threads für jede Aufgabe zu erstellen und zu beenden, reduziert den Overhead und vereinfacht die Synchronisation.



Die wichtigsten Vorteile:

  • Automatische Lastverteilung auf CPU-Kerne
  • Wiederverwendung von Threads (Ressourcenschonung)
  • Einfaches Hinzufügen neuer Aufgaben ohne Blockierungen
  • Möglichkeit der Priorisierung und des Abbruchs von Aufgaben


Beliebte Bibliotheken für Aufgabenwarteschlangen in C++



1. Intel Threading Building Blocks (TBB)

Eine der leistungsstärksten Bibliotheken, entwickelt von Intel. Bietet tbb::parallel_for, tbb::task_group und einen flexiblen Task-Scheduler. Geeignet für Hochleistungsberechnungen.

#include <tbb/task_group.h>#include <iostream>

int main() { tbb::task_group tg; tg.run([] { std::cout << "Aufgabe 1"; }); tg.run([] { std::cout << "Aufgabe 2"; }); tg.wait(); // auf Fertigstellung warten return 0;}


2. Boost.Task (veraltet, aber Konzepte leben in Boost.Fiber weiter)

Früher gab es in Boost die Bibliothek Boost.Task, heute ist ihre Funktionalität teilweise in Boost.Fiber übergegangen. Ermöglicht die Erstellung von Warteschlangen mit Prioritäten und asynchronen Ergebnissen.

// Beispiel mit Boost.Fiber (moderne Alternative)#include <boost/fiber/all.hpp>#include <iostream>

int main() { boost::fibers::fiber f1([]{ std::cout << "Faser 1"; }); f1.join(); return 0;}


3. PPL (Parallel Patterns Library) – für Windows

Bibliothek von Microsoft, integriert in Visual Studio. Verwendet concurrency::task und concurrency::parallel_for. Lässt sich hervorragend in Windows Runtime integrieren.

#include <ppltasks.h>#include <iostream>

int main() { concurrency::create_task([]{ std::cout << "PPL-Aufgabe"; }).wait(); return 0;}


4. QtConcurrent – für Qt-Projekte

Wenn Sie Qt verwenden, sind QtConcurrent::run und QThreadPool eine einfache Möglichkeit, eine Aufgabenwarteschlange zu organisieren.

#include <QtConcurrent/QtConcurrentRun>#include <iostream>

int main() { QtConcurrent::run([]{ std::cout << "Qt-Aufgabe"; }); QThread::msleep(100); return 0;}


Implementierung einer einfachen Aufgabenwarteschlange mit std::thread

Wenn Sie keine externen Bibliotheken einbinden möchten, können Sie Ihre eigene Warteschlange schreiben. Nachfolgend ein minimales funktionierendes Beispiel in C++17.



#include <iostream>#include <queue>#include <thread>#include <mutex>#include <condition_variable>#include <functional>

class TaskQueue {public: explicit TaskQueue(size_t threads) { for (size_t i = 0; i < threads; ++i) { workers.emplace_back([this] { while (true) { std::function<void()> task; { std::unique_lock<std::mutex> lock(mutex); condition.wait(lock, [this]

Empfehlungen