O que você vai aprender
Identificar condições de corrida e a necessidade de exclusão mútua.
Explicar semáforos e monitores.
Aplicar wait/signal na proteção de regiões críticas.
Consolidar os conceitos para a Avaliação 1.
Quando a ordem estraga tudo
Vimos que threads e processos compartilham dados. Mas, quando dois acessam o mesmo dado ao mesmo tempo, o resultado pode ficar errado e imprevisível. Esse é o coração da concorrência — e o problema que a sincronização resolve.
Esta aula encerra o bloco 1 do curso e prepara a Avaliação 1. Dominar condições de corrida, exclusão mútua, semáforos e monitores é essencial para a prova e para tudo o que vem depois (deadlocks).
O que veremos nesta aula
de corrida→Exclusão
mútua→Semáforos→Monitores→Revisão
Prova 1
Condição de corrida e região crítica
Região crítica. Trecho de código que acessa o recurso compartilhado e não pode ser executado por dois ao mesmo tempo.
Por que a corrida acontece
Operações que parecem atômicas (como saldo = saldo + 1) na verdade são várias instruções: ler, somar, gravar. Se duas threads intercalam essas etapas, uma atualização se perde.
A causa é a falta de atomicidade: a sequência ler-modificar-gravar pode ser interrompida no meio.
O saldo bancário perdido
O esperado era 102, mas o resultado foi 101: uma atualização desapareceu por causa da intercalação.
Stepper: proteger com exclusão mútua
Exclusão mútua
Semáforos
wait/P (decrementa; bloqueia se ficaria < 0) e signal/V (incrementa; libera quem espera).Um semáforo binário (mutex) tem valor 0 ou 1 e protege uma região crítica. Um semáforo contador controla acesso a N recursos iguais.
A chave da sala
Semáforo × monitor
| Semáforo | Monitor | |
|---|---|---|
| Nível | Baixo (primitivo) | Alto (construção de linguagem) |
| Exclusão mútua | Pelo programador (wait/signal) | Garantida pela linguagem |
| Risco de erro | Maior (esquecer signal) | Menor |
| Exemplo | POSIX semaphores | synchronized (Java) |
O ciclo wait/signal
entra→Região
crítica→signal(s)
sai
Monitores e variáveis de condição
synchronized em Java), não pelo programador. As variáveis de condição permitem dormir até que algo fique verdadeiro (ex.: buffer não vazio).Verifique: valor inicial do mutex
Um semáforo binário usado como mutex é tipicamente inicializado em:
Produtor-consumidor
Um problema clássico: um produtor coloca itens num buffer e um consumidor os retira. É preciso sincronizar para que o consumidor não leia de um buffer vazio nem o produtor escreva num buffer cheio.
- Um semáforo conta posições cheias (o consumidor espera).
- Outro conta posições vazias (o produtor espera).
- Um mutex protege o acesso ao buffer.
Onde a sincronização falha
• Esquecer o
signal deixa o recurso travado para sempre.• Inverter a ordem dos waits em vários semáforos pode causar deadlock (Aula 8).
• Proteger só parte da região crítica não resolve a corrida.
• wait/signal precisam ser atômicos — por isso são providos pelo SO/linguagem.
Boas práticas de sincronização
• Mantenha a região crítica curta: só o estritamente necessário.
• Sempre pareie wait com signal (entra/sai).
• Prefira construções de alto nível (monitores, locks) quando disponíveis.
• Para a prova: saiba calcular o resultado de uma corrida e proteger com semáforo.
Revele: por que monitor é mais seguro
Por que dizemos que o monitor é mais seguro que o semáforo?
Revisão relâmpago
Revisão para a Prova 1
A Avaliação 1 cobre as semanas 1–6 mais esta. Conecte os temas:
- Fundamentos (Aulas 1–2): SO, modos, chamadas.
- Processos e threads (Aulas 3–4): estados, PCB, concorrência.
- Escalonamento (Aula 5): FCFS, SJF, RR (saiba calcular).
- IPC e sincronização (Aulas 6–7): comunicação e exclusão mútua.
A sincronização de hoje liga-se diretamente aos deadlocks (próxima aula): a ordem errada de wait pode travar tudo.
Fechando a aula
Atividade em grupo · Mutirão de revisão (Prova 1)
Em grupos, montem um mapa de revisão das semanas 1–6 e resolvam a corrida.
Roteiro
- Cada integrante fica com um tema: introdução/estrutura, processos, threads, escalonamento.
- Montem um mapa mental conectando os temas (uma página).
- Resolvam o problema do saldo bancário usando um semáforo (escrevam o pseudocódigo com wait/signal).
- Criem 2 questões originais por tema e troquem com outro grupo.
Mini-quiz · Aula 7
20 questões sobre esta aula. Escolha e veja a explicação na hora.
📌 Resumo — leve isto para a prova
- Condições de corrida surgem do acesso concorrente a dados compartilhados sem atomicidade.
- Exclusão mútua garante um processo por vez na região crítica.
- Semáforos usam wait/signal atômicos; o mutex (binário) inicia em 1; o contador controla N recursos.
- Monitores oferecem exclusão mútua de alto nível, garantida pela linguagem (ex.: synchronized).
- A ordem errada de bloqueios leva a deadlocks — ponte para a Aula 8; reveja tudo para a Prova 1.