Sincronización de Hebras con Semáforos en C: Control de Flujo con POSIX Threads

Informática y Telecomunicaciones3,02 KB

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.

Descargar

PDF Word HTML