Implementieren eines einfachen, generischen Thread-Pools in C ++ 11

Ich möchte einen Thread-Pool für experimentelle Zwecke erstellen (und für den Spaßfaktor). Es sollte in der Lage sein, eine Vielzahl von Aufgaben zu bearbeiten (damit ich es möglicherweise in späteren Projekten verwenden kann).

In meiner Thread-Pool-Klasse benötige ich eine Art Task-Warteschlange. Da die Standardbibliothekstd::packaged_task Seit dem C ++ 11-Standard sieht meine Warteschlange aus wiestd::deque<std::packaged_task<?()> > task_queue, damit der Client @ drücken kastd::packaged_tasks über eine öffentliche Schnittstellenfunktion in die Warteschlange (und dann wird einer der Threads im Pool mit einer Bedingungsvariablen zum Ausführen usw. benachrichtigt).

Meine Frage bezieht sich auf das Template-Argument desstd::packaged_task<?()>s in der deque.

Die Funktionssignatur?() sollte in der Lage sein, mit jeder Art / Anzahl von Parametern umzugehen, da der Client ungefähr Folgendes ausführen kann:

std::packaged_task<int()> t(std::bind(factorial, 342)); thread_pool.add_task(t);

So muss ich mich nicht mit der Art / Anzahl der Parameter befassen.

Aberwas soll der Rückgabewert sein? (daher das Fragezeichen)

Wenn ich meine gesamte Thread-Pool-Klasse zu einer Vorlagenklasse mache, kann eine Instanz davon nur Aufgaben mit einer bestimmten Signatur bearbeiten (z. B.std::packaged_task<int()>).

Ich möchte, dass ein Thread-Pool-Objekt mit jeder Art von Aufgabe fertig wird.

Wenn ich gehe mitstd::packaged_task<void()> und die aufgerufene Funktion gibt eine Ganzzahl oder irgendetwas zurück, dann ist das undefiniertes Verhalten.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage