son - C: ¿Cuál es la manera de hacer un hilo de piscina con pthreads?
que son los hilos en c (2)
Como un riff alternativo en la respuesta de cnicutar, puede usar las colas de mensajes POSIX que se ocuparán de las preocupaciones de sincronización en el núcleo. Habrá una pequeña sobrecarga para las llamadas del sistema que puede o no ser una preocupación. Es bastante mínimo ya que el kernel está haciendo todo lo que tendrías que hacer manualmente de todos modos.
Los subprocesos de los consumidores solo pueden bloquearse en mq_receive
y, si crea un tipo especial de mensaje de cola, le resulta fácil decirle a los subprocesos cuándo cerrar.
Tengo una cola de trabajos y quiero hacer un grupo de 4 hilos donde puedo lanzar mis trabajos. Estoy atascado en cómo hacer los hilos y mantenerlos suspendidos mientras no hay trabajo.
JOB QUEUE | job1 | job2 | job3 | job4 | ..
THREAD POOL | thread1 | thread2 | thread3 | thread4 |
Para crear los hilos que tengo actualmente en el punto de inicialización:
for (t=0; t<num_of_threads; t++){
pthread_create(&(threads[t]), NULL, doSth2, NULL);
}
Donde num_of_threads = 4 y doSth2 es una función sin nada dentro. Entonces, una vez que haya creado los 4 hilos y que hayan terminado con doSth2, ¿cómo puedo darles un nuevo trabajo para hacer, sin matarlos?
La clave de un grupo de subprocesos es una cola. Aquí están las funciones modificadas para un grupo de hilos que he desarrollado.
Poner el elemento en la cola
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);
}
Obtener elemento de la cola
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);
}