Modelo de Relatório de PPC
Por: bencdzporto • 10/8/2018 • Relatório de pesquisa • 1.612 Palavras (7 Páginas) • 245 Visualizações
Introdução
O objetivo desse relatório é descrever a aplicação dos conhecimentos e técnicas
aprendidos durante a disciplina de Programação Paralela e Concorrente – 2014.2,
através do problema da Conta Poupança, definido previamente no início da cadeira. O
relatório contém informações sobre o problema proposto, especificações sobre a
implementação, política e técnicas de sincronização utilizadas, estrutura de classes
adotadas, resultados obtidos e comentários sobre a experiência com o
desenvolvimento.
Problema da Conta de Poupança
Imagine a seguinte situação: temos uma conta poupança compartilhada por várias
pessoas. As pessoas (clientes) podem sacar ou depositar dinheiro continuamente. O
saldo da conta é resultado das transações de saque e depósito (saldo = valor dos
depósitos atuais – valor dos saques atuais).
A conta deve obedecer as seguintes especificações e restrições:
? O saldo não pode ser negativo (saldo >= 0,
sempre);
? Os depósitos e os saques devem ser
atendidos por ordem de chegada;
? Os clientes de saque devem seguir uma
política de fila, onde o primeiro a chegar
deve ser o primeiro a ser atendido – FIFO;
? Os clientes devem trabalhar com os valores
de 100, 200 e 300 reais, tanto pra saque,
como pra depósito;
? O intervalo entre as transações deve ser de
2 segundos (2000 ms);
? A fila de espera de saque não tem tamanho
definido e não há fila para depósito;
? Os clientes de saque devem “dormir”
quando estiverem esperando na fila sua vez.
Implementação
O projeto foi desenvolvido utilizando a linguagem de programação C#, com o
ambiente de desenvolvimento Visual Studio 2010 sobre uma aplicação Console. Os
mecanismos de sincronização foram os Monitores nativos da própria linguagem
(Monitor) e os métodos de controle das condições de sincronização Wait(lock) e
PulseAll(lock) (análogos ao wait() e notifyAll() de Java, respectivamente) foram
adotados.
O projeto ContaPoupanca foi criado, juntamente com as classes:
? Banco: contém os métodos base de sincronização dos clientes de saque
(Sacar) e depósito (Depositar), juntamente com o métodos de adição de cliente
sacador na fila definida na classe, através da seguinte linha de código:
private Queue<ClienteSaque> filaSaque = new Queue<ClienteSaque>();
? ClienteDeposito: com construtor implementado e método Run, que chama o
método Depositar da instância de Banco (banco), presente em cada cliente.
? ClienteSaque: com construtor implementado e método Run, que chama o
método AddClienteSaque, passando como parâmetro o cliente atual, e
método Sacar presente da instância de Banco (banco) presente em cada
cliente.
? Program (Principal): contém a Main e foi onde os mecanismos de criação das
Threads foi implementado.
? Tipo: enum que contém cada tipo de cliente que possa vir a ser criado, tanto
em relação a transação (Saque ou Depósito), como em relação aos valores
(100, 200 e 300 reais). A saber:
public enum Tipo
{
Saque100 = 0,
Saque200 = 1,
Saque300 = 2,
Deposito100 = 3,
Deposito200 = 4,
Deposito300 = 5
}
? RandomGerador: contém métodos de geração aleatória de nome das
Threads, tipo das Threas, obedecendo ao enum Tipo e valores (100, 200 ou
300);
Mecanismo de Sincronização
A classe Banco contém os métodos sincronizados, ilustrados abaixo, que controlam o
recurso de saldo da conta poupança, Sacar – referente ao controle dos ClienteSaque,
e Depositar – referente ao controle dos ClienteDeposito.
class Banco{
public void Sacar(int valor)
{
Monitor.Enter(lockObj);
try
{
//Enquanto o valor de saque for maior que o valor de
//saldo disponível, ou saldo negativo, faça a thread requerente
//dormir; se condição foi atendida, acorde as threads
while ( (valor > saldo || saldo <= 0))
{
Monitor.Wait(lockObj);
Monitor.PulseAll(lockObj);
}
...