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.

Programa sencillo en C con pthreads – Pregunta de sincronización. #include #include #include #define NUM_THREADS 2 int count = 0; pthread_mutex_t mutex; void* increment_counter(void *thread_id) { pthread_mutex_lock(&mutex); count++; printf(“Hilo %d incrementó el contador a %d\n”, *(int*)thread_id, count); pthread_mutex_unlock(&mutex); pthread_exit(NULL); } int main() { pthread_t threads[NUM_THREADS]; int thread_ids[NUM_THREADS] = {1, 2}; pthread_mutex_init(&mutex, NULL); for (int i = 0; i < NUM_THREADS; i++) { int rc = pthread_create(&threads[i], NULL, increment_counter, (void*)&thread_ids[i]); if (rc) { printf("Error al crear el hilo %d\n", i+1); exit(-1); } } for (int i = 0; i < NUM_THREADS; i++) { pthread_join(threads[i], NULL); } pthread_mutex_destroy(&mutex); printf("El contador final es: %d\n", count); pthread_exit(NULL); } Este programa sencillo en C utiliza pthreads para incrementar un contador de forma sincronizada. Se utiliza un mutex para asegurar que cada hilo accede al contador de manera exclusiva. Cada hilo incrementa el contador en uno y muestra el resultado por pantalla. Finalmente, se muestra el valor final del contador después de que todos los hilos hayan terminado.

Tengo este programa sencillo de C que utiliza pthreads.

Básicamente, quiero llamar a my_function() una vez que esté 100% seguro de que my_thread() se llama y se ejecuta.

Necesito saber cómo sincronizar la función main() y la función my_thread().

Por favor, tenga en cuenta que my_thread() nunca retorna.

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

void my_function(void);
void* my_thread(void* arg);

int main(int argc, char* argv[])
{
    int rc;
    pthread_t id;

    rc = pthread_create(&id, NULL, my_thread, NULL);
    if (rc != 0)
    {
        return -10;
    }

    /*
     * Quiero llamar a my_function() una vez que esté 100% seguro de que my_thread() se llama y se ejecuta
     */

    /*
     * Código de sincronización a agregar aquí:
     */     

    my_function();

    return 0;
}

void* my_thread(void* arg)
{
    /*
     * Este pthread nunca retorna
     */

    while (1)
    {
        /* cosas */
    };
}

void my_function(void)
{
    printf("Hola\n");
}

Gracias por su ayuda.</pthread.h></stdio.h>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para sincronizar la función main() y la función my_thread(), puedes utilizar un mecanismo de sincronización como un mutex o un semáforo. Aquí tienes un ejemplo utilizando un mutex:

    1. Declara una variable pthread_mutex_t en la parte superior de tu código:
      pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
      
    2. Bloquea el mutex al final de la función my_thread():
      pthread_mutex_lock(&mutex);
      
    3. Desbloquea el mutex en la función main() después de llamar a my_function():
      pthread_mutex_unlock(&mutex);
      
    4. Agrega lo siguiente antes de llamar a my_function():
      pthread_mutex_lock(&mutex);
      pthread_mutex_unlock(&mutex);
      

    Esto asegurará que my_thread() se ejecute y bloquee el mutex antes de que my_function() sea llamada desde la función main(). Aquí está el código modificado:

    “`c
    #include <stdio.h>
    #include <pthread.h>

    void my_function (void);
    void* my_thread (void* arg);

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

    int main (int argc, char* argv[])
    {
    int rc;
    pthread_t id;

    rc = pthread_create(&id, NULL, my_thread, NULL);
    if (rc != 0)
    {
        return -10;
    }
    
    /*
     * Código de sincronización a agregar aquí:
     */    
    pthread_mutex_lock(&mutex);
    pthread_mutex_unlock(&mutex);
    
    my_function();
    
    
    return 0;
    

    }

    void* my_thread (void* arg)
    {

    /*
     * Este hilo nunca regresa
     */
    
    while (1)
    {
        /* cosas */
    };
    
    pthread_mutex_lock(&mutex);
    

    }

    void my_function (void)
    {
    printf(“Hola\n”);
    }
    “`</pthread.h></stdio.h>

Comments are closed.