Sincronização e condições de corrida
Implemente mutexes e semáforos para gerenciar recursos compartilhados com segurança.
Sincronização e condições de corrida é uma aula grátis de C Academy no CoddyKit. Esta é a aula 3 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C Academy inclui 3 aulas no total.
Sincronização e condições de corrida
Sincronização e condições de corrida
Quando várias linhas de execução acessam recursos compartilhados, podem ocorrer condições de corrida, levando a resultados imprevisíveis.
Nesta lição, você aprenderá:
- O que são condições de corrida e como elas ocorrem.
- Como usar mecanismos de exclusão mútua para evitar condições de corrida.
- Como os semáforos ajudam a gerenciar recursos compartilhados.

O que é uma condição de corrida?
O que é uma condição de corrida?
Uma condição de corrida ocorre quando várias linhas de execução acessam dados compartilhados simultaneamente, levando a um comportamento imprevisível.
Exemplo:
- Duas linhas de execução tentam atualizar um contador global.
- O valor final pode estar incorreto devido à interferência.
Exemplo: condição de corrida na execução com múltiplas linhas
Exemplo: condição de corrida na execução com múltiplas linhas
Este programa demonstra uma condição de corrida na qual várias linhas de execução modificam uma variável compartilhada.
#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;
}Evitando condições de corrida com exclusão mútua
Evitando condições de corrida com exclusão mútua
Um mecanismo de exclusão mútua garante que apenas uma linha de execução acesse um recurso por vez.
Funções de exclusão mútua:
pthread_mutex_init()- Inicializa um mecanismo de exclusão mútua.pthread_mutex_lock()- Bloqueia o mecanismo de exclusão mútua.pthread_mutex_unlock()- Desbloqueia o mecanismo de exclusão mútua.pthread_mutex_destroy()- Destrói o mecanismo de exclusão mútua.
Exemplo: usando exclusão mútua para evitar condições de corrida
Exemplo: usando exclusão mútua para evitar condições de corrida
Este programa corrige a condição de corrida usando exclusão mútua para controlar o acesso ao contador compartilhado.
#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;
}O que é um semáforo?
O que é um semáforo?
Um semáforo é um contador usado para controlar o acesso a recursos.
Principais funções:
sem_init()- Inicializa um semáforo.sem_wait()- Diminui o valor do semáforo.sem_post()- Aumenta o valor do semáforo.sem_destroy()- Destrói o semáforo.
Exemplo: usando semáforos para sincronização
Exemplo: usando semáforos para sincronização
Este programa usa um semáforo para gerenciar o acesso a um recurso compartilhado.
#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áticas recomendadas para sincronizar linhas de execução
Práticas recomendadas para sincronizar linhas de execução
Para evitar condições de corrida:
- Use mecanismos de exclusão mútua para proteger variáveis compartilhadas.
- Use semáforos para gerenciar recursos.
- Minimize o uso de recursos compartilhados sempre que possível.
Resumo
Resumo
Nesta lição, você aprendeu:
- O que são condições de corrida e como elas ocorrem.
- Como usar mecanismos de exclusão mútua para evitar condições de corrida.
- Como os semáforos ajudam a gerenciar o acesso a recursos compartilhados.
Isso conclui a seção Execução com múltiplas linhas e concorrência em C!

Perguntas Frequentes
A aula “Sincronização e condições de corrida” é grátis?
Sim — o texto completo de “Sincronização e condições de corrida” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C Academy, atualize para CoddyKit PRO. O curso de C Academy inclui 3 aulas no total.
O que vou aprender em “Sincronização e condições de corrida”?
Implemente mutexes e semáforos para gerenciar recursos compartilhados com segurança. Você pratica C Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C Academy?
Nenhuma experiência prévia é necessária. C Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 3.
Quanto tempo leva a aula “Sincronização e condições de corrida”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C Academy?
Sim. Cada aula de C Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Introdução às threads
- Criação e gerenciamento de threads
- Sincronização e condições de corrida