Você está na página 1de 39

Módulo 4: Laboratório de Programação

Aula 2
Sincronização e Coordenação; Problemas de
Produtor-Consumidor
Sincronização de Threads



Comunicação entre Threads
condição de corrida
mesmos dados mesmo tempo
Exemplo com uma Stack

Operação não-atómica (3 passos)


1. Ler pos da memória
2. Incrementar pos
3. Guardar pos em memória
Exemplo com uma Stack (cont.)
mesma Stack mesmo
tempo

Resultado Coerente Resultado Incoerente


Interferência entre Threads

não-atómicas conjunto de operações


atómicas
Erros de Inconsistência de dados

Thread A Thread B

É importante estabelecer ordem na execução de diferentes operações de


threads distintas.
Sincronização e Operações Atómicas
Operações Atómicas

Secção crítica

Synchronized
Sincronização
suspender
Cadeados

cadeado está aberto


fecha o cadeado
Mutex: Exclusão Mútua

Lock Unlock
Mutex: Exclusão Mútua
Thread A
secção crítica
pedido unlock (liberta o
lock (adquire o cadeado)
cadeado)

Cadeado
bloqueio lock
(adquire o
cadeado)
unlock (liberta o
Thread B pedido cadeado)
sem progresso secção crítica
Tempo
Cadeados Intrínsecos

synchronized
Exemplo Synchronized (Stack)

Adquire Cadeado (Lock)

Liberta Cadeado (Unlock)


Exemplo Bloco Synchronized

Adquire cadeado do próprio


objeto

Liberta próprio cadeado

Adquire cadeado do objeto


“company”

Liberta cadeado da “company”


Exercício 1
Incremento e decremento concorrente



20
1000 1
Exercício 1 - Resolução
Exercício 1 - Resolução
Exercício 1 - Resolução

Contador

0
Coordenação

● produtor-consumidor
Produtor de Números
Consumidor
Recurso Partilhado
Sem Coordenação

4
Coordenação entre Threads

não só sincronizar
Coordenação entre Threads
dentro

wait notify notifyAll


Recurso Partilhado (Nova Versão)

Coloca a thread em espera e


liberta o cadeado

Thread saiu da espera e adquiriu


o cadeado

Notifica threads em espera


Recurso Partilhado (Nova Versão)

Coloca a thread em espera e


liberta o cadeado

Thread saiu da espera e adquiriu


o cadeado

Notifica threads em espera


Método wait();
wait
notify() notifyAll()
Método wait();
Método wait();
wait(long timeout)

wait(0) wait()
Exemplo
Métodos notify() e notifyAll()
notify
notifyAll
Exercício 2
Exercício 2 - Resolução
Produtor: Chefe de cozinha O produtor é Consumidor: Empregado
uma Thread.
O consumidor
é uma Thread.

O chefe está
constantemente a O empregado está
tentar colocar um prato, constantemente a
ficando em espera tentar ir buscar um
quando o último ainda prato, ficando em espera
não foi servido quando ainda não foi
cozinhado
Exercício 2 - Resolução
Recurso Partilhado: Restaurante

A sincronização é
sempre feita no recurso
partilhado. Depois de uma refeição
Esta é a única forma de ser produzida ou
garantir exclusão mútua consumida, todos as
no acesso à região threads são notificadas.
crítica, pois o cadeado Assim, são acordados
usado para a todos os produtores e
sincronização entre o todos os consumidores,
produtor e o que verificam a guarda
consumidor é o mesmo, do while e avançam, se
o do restaurante.. estiverem em condições
Exercício 2 - Resolução
Há apenas uma instância do
recurso partilhado, que é
Objeto trocado: Refeição Main de teste passada tanto aos
produtores como aos
consumidores. Daí o nome
“recurso partilhado”.
Exercício 3

Você também pode gostar