0Pricing
C Academy · Lección

Sincronización y condiciones de carrera

Implemente mutexes y semáforos para gestionar recursos compartidos de forma segura

Sincronización y condiciones de carrera es una lección gratuita de C Academy en CoddyKit. Esta es la lección 3 de 3. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C Academy incluye 3 lecciones en total.

Sincronización y condiciones de carrera

Sincronización y condiciones de carrera

Cuando varios hilos acceden a recursos compartidos, pueden producirse condiciones de carrera que provoquen resultados impredecibles.

En esta lección, aprenderá:

  • Qué son las condiciones de carrera y cómo se producen.
  • Cómo utilizar mutexes para evitar condiciones de carrera.
  • Cómo ayudan los semáforos a gestionar los recursos compartidos.
Sincronización y condiciones de carrera — ilustración 1

¿Qué es una condición de carrera?

¿Qué es una condición de carrera?

Una condición de carrera se produce cuando varios hilos acceden simultáneamente a datos compartidos, lo que provoca un comportamiento impredecible.

Ejemplo:

  • Dos hilos intentan actualizar un contador global.
  • El valor final puede ser incorrecto debido a la interferencia.

Ejemplo: condición de carrera en el multihilo

Ejemplo: condición de carrera en el multihilo

Este programa muestra una condición de carrera en la que varios hilos modifican una variable compartida.

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

int counter = 0;

void *incrementCounter(void *arg) {
    for (int i = 0; i < 1000000; i++) {
        counter++;
    }
    return NULL;
}

int main() {
    pthread_t t1, t2;
    pthread_create(&t1, NULL, incrementCounter, NULL);
    pthread_create(&t2, NULL, incrementCounter, NULL);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    printf("Final counter value: %d\n", counter);
    return 0;
}

Cómo evitar condiciones de carrera con un mutex

Cómo evitar condiciones de carrera con un mutex

Un mutex (exclusión mutua) garantiza que solo un hilo acceda a un recurso cada vez.

Funciones de mutex:

  • pthread_mutex_init() - Inicializa un mutex.
  • pthread_mutex_lock() - Bloquea el mutex.
  • pthread_mutex_unlock() - Desbloquea el mutex.
  • pthread_mutex_destroy() - Destruye el mutex.

Ejemplo: uso de un mutex para evitar condiciones de carrera

Ejemplo: uso de un mutex para evitar condiciones de carrera

Este programa corrige la condición de carrera mediante un mutex que controla el acceso al contador compartido.

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

int counter = 0;
pthread_mutex_t lock;

void *incrementCounter(void *arg) {
    for (int i = 0; i < 1000000; i++) {
        pthread_mutex_lock(&lock);
        counter++;
        pthread_mutex_unlock(&lock);
    }
    return NULL;
}

int main() {
    pthread_t t1, t2;
    pthread_mutex_init(&lock, NULL);
    pthread_create(&t1, NULL, incrementCounter, NULL);
    pthread_create(&t2, NULL, incrementCounter, NULL);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_mutex_destroy(&lock);
    printf("Final counter value: %d\n", counter);
    return 0;
}

¿Qué es un semáforo?

¿Qué es un semáforo?

Un semáforo es un contador que se utiliza para controlar el acceso a los recursos.

Funciones principales:

  • sem_init() - Inicializa un semáforo.
  • sem_wait() - Disminuye el valor del semáforo.
  • sem_post() - Aumenta el valor del semáforo.
  • sem_destroy() - Destruye el semáforo.

Ejemplo: uso de semáforos para la sincronización

Ejemplo: uso de semáforos para la sincronización

Este programa utiliza un semáforo para gestionar el acceso a un recurso compartido.

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

sem_t sem;

void *task(void *arg) {
    sem_wait(&sem);
    printf("Thread %d is executing\n", *(int *)arg);
    sem_post(&sem);
    return NULL;
}

int main() {
    pthread_t t1, t2;
    int id1 = 1, id2 = 2;
    sem_init(&sem, 0, 1);
    pthread_create(&t1, NULL, task, &id1);
    pthread_create(&t2, NULL, task, &id2);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    sem_destroy(&sem);
    return 0;
}

Prácticas recomendadas para sincronizar hilos

Prácticas recomendadas para sincronizar hilos

Para evitar condiciones de carrera:

  • Utilice mutexes para proteger las variables compartidas.
  • Utilice semáforos para gestionar los recursos.
  • Minimice el uso de recursos compartidos siempre que sea posible.

Resumen

Resumen

En esta lección, aprenderá:

  • Qué son las condiciones de carrera y cómo se producen.
  • Cómo utilizar mutexes para evitar condiciones de carrera.
  • Cómo ayudan los semáforos a gestionar el acceso a los recursos compartidos.

Con esto concluye la sección sobre multihilo y concurrencia en C.

Sincronización y condiciones de carrera — ilustración 10

Preguntas frecuentes

¿La lección «Sincronización y condiciones de carrera» es gratis?

Sí — el texto completo de «Sincronización y condiciones de carrera» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C Academy, actualiza a CoddyKit PRO. El curso de C Academy incluye 3 lecciones en total.

¿Qué aprenderé en «Sincronización y condiciones de carrera»?

Implemente mutexes y semáforos para gestionar recursos compartidos de forma segura Practicas C Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C Academy?

No se requiere experiencia previa. C Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 3.

¿Cuánto tiempo toma la lección «Sincronización y condiciones de carrera»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C Academy?

Sí. Cada lección de C Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Introducción a los hilos
  2. Creación y gestión de hilos
  3. Sincronización y condiciones de carrera
← Volver a C Academy