Implementación de un grupo de subprocesos genérico simple en C ++ 11

Quiero crear un grupo de subprocesos con fines experimentales (y por diversión). Debería poder procesar una amplia variedad de tareas (por lo que posiblemente pueda usarlo en proyectos posteriores).

En mi clase de grupo de subprocesos voy a necesitar algún tipo de cola de tareas. Dado que la Biblioteca estándar proporcionastd::packaged_task desde el estándar C ++ 11, mi cola se verá asístd::deque<std::packaged_task<?()> > task_queuepara que el cliente pueda empujarstd::packaged_tasks en la cola a través de algún tipo de función de interfaz pública (y luego se notificará a uno de los hilos del grupo con una variable de condición para ejecutarlo, etc.).

Mi pregunta está relacionada con el argumento de plantilla delstd::packaged_task<?()>s en la deque.

La firma de la función?() debería poder manejar cualquier tipo / número de parámetros, porque el cliente puede hacer algo como:

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

Entonces no tengo que lidiar con el tipo / número de parámetros.

Pero¿Cuál debería ser el valor de retorno? (de ahí el signo de interrogación)

Si convierto toda mi clase de grupo de subprocesos en una clase de plantilla, una instancia de esta solo podrá tratar tareas con una firma específica (comostd::packaged_task<int()>)

Quiero que un objeto de grupo de subprocesos pueda manejar cualquier tipo de tarea.

Si voy constd::packaged_task<void()> y la función invocada devuelve un entero, o cualquier cosa, ese es un comportamiento indefinido.

Respuestas a la pregunta(2)

Su respuesta a la pregunta