[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: [reverbel-mac438] ep4 - duvida



Fala Fabior,
Então. O problema de pegar saldo assim como você mostrou é o seguinte:
Imagine dois clientes rodando:
'transf 100 1 2'
e
'saldo 1 2'
Suponha que ambas as contas tem 100 de saldo.
Agora imagine que ocorre a seguinte execução:

conta 1: r.lock(); c1.veSaldo(); r.unlock(); // imprime 100

dae o processador suspende essa thread e põe a outra e ela roda a
transferencia. Ela acaba e agora volta a thread antiga:

conta 2: r.lock(); c2.veSaldo(); r.unlock(); // imprime 200

Você pegou um estado inconsistente porque você está vendo 300 reais entre
as duas contas sendo que na verdade só tem 200.

Entendeu?
Por isso você precisa garantir que a recuperação da informação de todos os
saldos aconteçam sem que outras operações possam modificar o saldo.

Espero ter resolvido o problema,
Abraços,
Hugo

> Olá lista,
>
> O enunciado do ep4 diz que devemos usar uma estrategia para prevenir
deadlocks para as operacoes 'saldo' e 'transf'.
> Para 'transf' eu entendo o problema, por exemplo no caso de 'transf
<quantia> 1 2' e 'transf <quantia2> 2 1'.
> Mas Para a operacao 'saldo' nao o vejo, pois não há aquisicoes de lock
encaixados, por exemplo:
>
> 'saldo 1 2 3'
> Seria: conta 1: r.lock(); c1.veSaldo(); r.unlock();
>        conta 2: r.lock(); c2.veSaldo(); r.unlock();
>        conta 3: r.lock(); c3.veSaldo(); r.unlock();
>
> Logo, nao vejo problema com deadlock para a operacao 'saldo'.
>
> Claro que posso estar enganado.
> Alguem pode esclareceer minha duvida?
>
> Obrigado,
>
> FAbio M Reaes
>
>