Sincronización de Hebras con Semáforos en C: Control de Flujo con POSIX Threads
Agregar semáforos para sincronizar hebras
Agrega los semáforos necesarios que permitan cumplir las siguientes reglas de precedencia entre los módulos de las hebras:
- c1 no debe comenzar hasta que termine a1.
- a2 no debe comenzar hasta que termine b1.
- c2 no debe comenzar hasta que termine b2.
- b3 no debe comenzar hasta que termine a2.
- a3 no debe comenzar hasta que termine c2.
- b4 debe ser el último proceso en terminar.
Código fuente
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
/* Declaración de los semáforos a usar, deben declararse globalmente */
sem_t sem_c1, sem_a2, sem_c2, sem_b3, sem_a3, sem_b4;
/* Prototipos de las funciones */
static void * hiloA (void* arg);
static void * hiloB (void* arg);
static void * hiloC (void* arg);
static void a1();
static void a2();
static void a3();
static void b1();
static void b2();
static void b3();
static void b4();
static void c1();
static void c2();
static void c3();
int main ()
{
/* Inicialización de semáforos. Todos en cero */
sem_init(&sem_c1, 0, 0);
sem_init(&sem_a2, 0, 0);
sem_init(&sem_c2, 0, 0);
sem_init(&sem_a3, 0, 0);
sem_init(&sem_b3, 0, 0);
sem_init(&sem_b4, 0, 0);
/* Declaración de los identificadores de las hebras TID de tipo pthread_t */
pthread_t hA, hB, hC;
/* Creación de las hebras */
pthread_create (&hA, NULL, *hiloA, NULL);
pthread_create (&hB, NULL, *hiloB, NULL);
pthread_create (&hC, NULL, *hiloC, NULL);
/* Esperar hasta que cada hebra termine */
pthread_join (hA, NULL);
pthread_join (hB, NULL);
pthread_join (hC, NULL);
printf("Finalizado");
return 0;
}
static void * hiloA (void* arg) /* Hebra A con 3 módulos */
{
a1 ();
sem_post(&sem_c1);
sem_wait(&sem_a2);
a2 ();
sem_post(&sem_b3);
sem_wait(&sem_a3);
a3 ();
sem_post(&sem_b4);
}
static void * hiloB (void* arg) /* Hebra B de dos módulos */
{
b1 ();
sem_post(&sem_a2);
b2 ();
sem_post(&sem_c2);
sem_wait(&sem_b3);
b3 ();
sem_wait(&sem_b4);
b4 ();
}
static void * hiloC (void* arg) /* Hebra C con tres módulos */
{
sem_wait(&sem_c1);
c1 ();
sem_wait(&sem_c2);
c2 ();
sem_post(&sem_a3);
c3 ();
}
void a1() {
printf("a1\n");
}
void a2() {
printf("a2\n");
}
void a3() {
printf("a3\n");
}
void b1() {
printf("b1\n");
}
/* ... */Observaciones
El documento original se encuentra truncado a partir de la función b1(), por lo que las funciones b2(), b3(), b4(), c1(), c2() y c3() no se incluyen completas en el texto recibido.