Created by Thiago Russo
over 8 years ago
|
||
Question | Answer |
Pq é necessário sincronizar recursos quando se trabalha em ambiente multithread? | Com o apoio de TPL fica mto fácil criar várias Threads. Mas podemos ter problemas ao acessar os mesmos dados a partir de várias Threads simultaneamente. Sem sincronizar os recursos, a operação não fica atômica |
Exemplo de 2 Threads acessando o mesmo dado compartilhado | |
O operador lock Exemplo, explicação e possível problema | |
lock como utilizá-lo | Usar a instrução lock com objeto de referência que é privado para a classe. Um obj público pode ser utilizado por outras threads, que podem bloqueá-lo. Deve tb ser um tipo de referência, porque um tipo de valor iria ficar "boxed" cada vez que você obtém um bloqueio. Geraria um bloqueio completamente novo de cada vez, perdendo o mecanismo de bloqueio. Felizmente, o compilador ajuda lançando um erro qdo vc usa um tipo de valor. Deve evitar tb o bloqueio da variável this porque essa variável poderia ser usado por outro código para criar um bloqueio. |
Deadlock utilizando operador lock | |
Volatile class (classe volátil) Pra que serve? Qdo usar? | O compilador às vezes muda a ordem das declarações no seu código. Normalmente, isso não seria um problema em um ambiente single-threaded. P/ corrigir isso, além de lock, pode usar System.Threading.Volatile q tem médodos especiais q desativam as otimizações do compilador. Usá-los é complicado e o .Net oferece a palavra-chave 'volatile': public static volatile int _flag = 0; Vc deve usar somente se realmente precisar dele. Pq ele desativa certas otimizações de compilador, ele irá prejudicar o desempenho. Tb ñ é algo que é suportado por todas as linguagens .NET (Visual Basic não tem), por isso dificulta a interoperabilidade de linguagem. |
Volatile class (classe volátil) exemplo | . |
Classe Interlocked O que é? | Em um problema de multithread envolvendo n++ e n--, vimos que a operação não era atômica, pois n ++ é traduzido em n = n + 1. Fazer operações atômicas é o trabalho da classe Interlocked que pode ser encontrado no namespace System.Threading. Ao usar o Interlocked.Increment e Interlocked.Decrement, você cria uma operação atômica, Em aplicações + complexas q add ou subtrair, ainda utilzaremos lock |
Classe Interlocked Exemplo | |
Interlocked.Exchange | if (Interlocked.Exchange (ref isInUse, 1) == 0) { } Este código recupera o valor atual e imediatamente define como o novo valor na mesma operação. Ele retorna o valor anterior antes de modificá-lo. Temos tb o CompareExchange: Este método verifica para ver se o é o valor esperado ; se for, ele substitui-lo com outro valor. |
Compare exchange as a nonatomic operation |
Want to create your own Flashcards for free with GoConqr? Learn more.