Sincronizar la impresión multihilo con Mutex

CCBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este proyecto, aprenderás a usar un mutex para sincronizar la impresión de cadenas en un entorno multihilo. Modificarás un programa existente de "Teclado Caótico" para garantizar que las cadenas se impriman en el orden correcto sin ningún mezclado de letras.

👀 Vista previa

$ gcc printer.c -o printer -lpthread
$./printer
helloworld

🎯 Tareas

En este proyecto, aprenderás:

  • Cómo inicializar un mutex en la función init()
  • Cómo bloquear y desbloquear el mutex en la función printer() para garantizar un acceso exclusivo al proceso de impresión
  • Cómo compilar y ejecutar el programa modificado para observar la salida correcta

🏆 Logros

Después de completar este proyecto, podrás:

  • Comprender la importancia del mutex en la sincronización del acceso a recursos compartidos en un programa multihilo
  • Aplicar técnicas de bloqueo y desbloqueo de mutex para coordinar la ejecución de múltiples hilos
  • Detectar y corregir problemas en un programa multihilo para obtener la salida deseada

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/PointersandMemoryGroup(["Pointers and Memory"]) c/CompoundTypesGroup -.-> c/strings("Strings") c/PointersandMemoryGroup -.-> c/memory_address("Memory Address") c/FunctionsGroup -.-> c/function_declaration("Function Declaration") c/FunctionsGroup -.-> c/function_parameters("Function Parameters") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/strings -.-> lab-301495{{"Sincronizar la impresión multihilo con Mutex"}} c/memory_address -.-> lab-301495{{"Sincronizar la impresión multihilo con Mutex"}} c/function_declaration -.-> lab-301495{{"Sincronizar la impresión multihilo con Mutex"}} c/function_parameters -.-> lab-301495{{"Sincronizar la impresión multihilo con Mutex"}} c/output -.-> lab-301495{{"Sincronizar la impresión multihilo con Mutex"}} end

Inicializar el Mutex

En este paso, aprenderás a inicializar el mutex en la función init(). Sigue los pasos siguientes para completar este paso:

  1. Abre el archivo printer.c ubicado en el directorio /home/labex/project/.
  2. En el código ya dado para la función printer, el mutex se bloquea (pthread_mutex_lock(&mutex)) al principio para garantizar un acceso exclusivo al proceso de impresión. Una vez que se ha impreso completamente la cadena, el mutex se desbloquea (pthread_mutex_unlock(&mutex)), lo que permite a otro hilo imprimir.
  3. Localiza la función init() y agrega el siguiente código para inicializar el mutex:
void init()
{
    pthread_mutex_init(&mutex, NULL);
}

Esto inicializa la variable mutex utilizando la función pthread_mutex_init(), que es parte de la biblioteca de hilos POSIX (pthreads). El segundo argumento NULL especifica que estamos utilizando los atributos predeterminados del mutex.

Compilar y ejecutar el programa

Ahora que has completado las modificaciones al archivo printer.c, puedes compilar y ejecutar el programa.

  1. Abre una terminal y navega hasta el directorio /home/labex/project/.
  2. Compila el programa con la bandera -lpthread para enlazar la biblioteca de pthreads:
gcc printer.c -o printer -lpthread
  1. Ejecuta el programa:
./printer

Ahora deberías ver la salida:

helloworld

Las cadenas "hello" y "world" se imprimen en secuencia sin ningún mezclado de las letras, como se esperaba.

¡Felicidades! Has modificado con éxito el programa "Teclado Caótico" para que funcione como se pretendía.

✨ Revisar Solución y Practicar

Resumen

¡Felicidades! Has completado este proyecto. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.