Você está na página 1de 3

Nome: Nádia Ferraz de Aquino

Semestre: 4° / Turno: Noturno


RA: 1430961823019

Lista de Exercícios: Sincronização entre Threads

Respostas:

1) A condição de corrida ocorre quando dois ou mais processos disputam um mesmo


espaço vago alocado na memória. Sendo que todos podem ler, escrever e mudar seus
valores quase ao mesmo tempo. Pertencendo a esta condição uma das variáveis pode
não receber o retorno esperado, pois assim que esta voltar a buscar a informação
armazenada, outra variável poderá ter alterado o seu valor.

2) A condição de corrida ocorre quando a ordem na execução de duas ou mais threads


pode interferir em alguma variável ou no resultado de um programa. Essa condição
pode resultar com que todas as ordens possíveis tenham o efeito simular ao final da
aplicação: a consequência dessa condição pode não ser significativa. Um exemplo disso
é um caractere perdido no AsyncReadSocket pode não afetar o resultado do programa.

Por outro lado, o tempo do próprio sistema da thread pode por não aparentar que essa
condição de corrida seja visível, apesar de estar registrado em código. A condição de
corrida é um problema iminente, ocasionada (até) por simples alterações no algoritmo.
E, entendendo que diferentes máquinas virtuais terão ordens diferentes de execução de
suas threads, cabe ao desenvolvedor nunca permitir que uma condição de corrida
aconteça, mesmo que não esteja causada por um problema no sistema de
desenvolvimento.

3) As regiões críticas são elementos do programa onde os processos utilizam a memória


compartilhada, ocasionando (em certas situações) condições de corrida.

4) A operação de semáforo é o procedimento em que se cria um ponto (ou sinalização)


para que a thread execute o comando de dormir (sleep), permanecendo nessa pausa e
em seguida recebendo um comando de acordar(wake) para prosseguir com seu
processamento estipulado. Esse procedimento auxilia no manuseio e distribuição de
threads durante o acesso a áreas críticas.

a) Mutex: a operação de semáforo que utiliza mutex utiliza de um “porta de


segurança” durante o acesso às regiões críticas. Ao ler o mutex ela muda seu
valor binário para o valor de acesso da “porta de segurança”. Quando o
próximo processo ler a variável mutex e identificar a “porta de segurança”, ele
entrará no “estado de bloqueio” até que o processo que já estava usando a
região crítica envie um comando de destrave para a variável mutex.
b) Semáforo contador: é responsável por controlar o acesso à “região critica”
através do número de processos que passam por ela, podendo variar de up
para down. A operação down em um semáforo confere se o valor é maior do
que 0 e se for, ele decrementará o valor. A operação up incrementa o valor de
um semáforo específico. Se um ou mais processos estiverem em sleep naquele
semáforo, impossibilitados de completarem uma operação down anterior, um
desses processos será escolhido pelo sistema e será autorizado a completar
seu down.

5) O mutex também pode ser conhecido como bloqueio mutuamente exclusivo. Este tipo
de bloqueio é encontrado em diversos sistemas de threading como meio de
sincronização. Em linhas gerais, uma thread só pode pegar um mutex por vez. Se duas
threads tentarem pegar um mutex ao mesmo tempo, apenas uma terá sucesso. O outra
thread terá que esperar até que a primeira thread libere o bloqueio e só assim ela
poderá, na sequência, pegar mutex e seguir com sua operação.

Em Java já existe um bloqueio padrão que é criado para cada objeto do sistema, ocorre
quando um método é declarado sincronizado e a thread em execução no momento
deve reter o bloqueio atribuído ao objeto antes de conseguir prosseguir. A liberação
automática do bloqueio ocorre quando o método é concluído.

6) Synchronized significa que, em um ambiente multiencadeado, um objeto com (com


atribuição synchronized) não autoriza que duas threads acessem os métodos ou blocos
de código simultaneamente. Nesse caso uma thread não pode ler enquanto outra
thread o atualiza.

7) O método wait() interrompe a thread atual, similar ao efeito do sleep. Permanecendo


nesse estado até que outra thread use o método notify() no mesmo objeto..

8) É possível usar o método wait e notify nas seguintes construções:


● Áreas secretas que são liberadas ao se atingirem condições pré estabelecidas.
● Missões paralelas que dependem de outras atividades pré determinadas
(como itens, outras quests…)
● Missões que dependem do nível do personagem para iniciá-la.

Você também pode gostar