es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo imprimir AB BA AB BA BA con semáforos si ya puedo imprimir el grupo AB? en C

Actualmente estoy utilizando multi-hilo y semáforos. Estoy utilizando semáforos y 2 hilos en C, tengo 2 funciones en las cuales imprimo A en el primer hilo y en la otra imprimo B. TOTAL es la variable que indica el número de repeticiones, que son 5 pares de letras.

Este programa puede imprimir AB AB AB AB secuencialmente.

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>

#include <unistd.h>

#define TOTAL_SIZE 5

sem_t semaphore1;
sem_t semaphore2;

void printA(void *p)
{
    int i;

    for (i = 0; i < TOTAL_SIZE; i++)
    {
        sem_wait(&semaphore1);
        printf("A");
        fflush(NULL);

        sem_post(&semaphore2);
    }

    pthread_exit(NULL);
}

void printB(void *p)
{

    int i;

    for (i = 0; i < TOTAL_SIZE; i++)
    {
        sem_wait(&semaphore2);
        printf("B");
        fflush(NULL);
        sleep(random() % 2);
        sem_post(&semaphore1);
    }

    pthread_exit(NULL);
}

int main(void)
{

    pthread_t th1, th2;

    sem_init(&semaphore1, 0, 1);
    sem_init(&semaphore2, 0, 0);
    if (pthread_create(&th1, NULL, (void *)printA, (void *)NULL) != 0)
    {
        printf("Error creating thread\n");
    }
    if (pthread_create(&th2, NULL, (void *)printB, (void *)NULL) != 0)
    {
        printf("Error creating thread\n");
    }
    pthread_join(th1, NULL);
    pthread_join(th2, NULL);

    sem_destroy(&semaphore1);
    sem_destroy(&semaphore2);
    return 0;
}

Esto produce la siguiente salida:

AB AB AB AB AB

Mi pregunta es, ¿cómo puedo obtener AB BA AB BA BA? El tamaño total es de 5 pares.</unistd.h></stdlib.h></stdio.h></semaphore.h></pthread.h>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr AB BA AB BA BA utilizando el código existente y los semáforos es modificar la función printB para imprimir “BA” en lugar de “B” y cambiar el orden de los semáforos en la función de la siguiente manera:

    void printB(void *p)
    {
        int i;
        for (i = 0; i < TOTAL_SIZE; i++)
        {
            sem_wait(&semaphore2); // esperar al semáforo2
            printf("BA");
            fflush(NULL);
            sleep(random() % 2);
            sem_post(&semaphore1); // señalizar semáforo1
    
            sem_wait(&semaphore2); // esperar al semáforo2 de nuevo
            printf("A");
            fflush(NULL);
            sem_post(&semaphore1); // señalizar semáforo1 de nuevo
        }
        pthread_exit(NULL);
    }
    

    Esto resultará en la siguiente salida:

    AB BA AB BA BA
    

    Ten en cuenta que el orden en el que se crean y unen los hilos no afecta la salida. Sin embargo, la llamada a sleep en la función printB puede causar ligeras variaciones en el tiempo de salida.

Comments are closed.