Evitar impasses em um processo multithreaded
-
20-08-2019 - |
Pergunta
O que são as melhores práticas / expressões idiomáticas que alguém deveria seguir a fim de impasses evitar?
Solução
Por favor, veja Quais são as razões comuns para impasses?
Outras dicas
Há quatro condições que devem ocorrer para impasse para ocorrer:
-
Mutual condição de exclusão: um recurso que não pode ser usado por mais de um processo de cada vez
-
Espera e condição de espera: processos já segurando recursos pode solicitar novos recursos
-
Sem condição de preempção: Nenhum recurso pode ser retirado à força de um processo de segurá-lo, os recursos podem ser liberados apenas pela ação explícita do processo
-
circular condição de espera: dois ou mais processos de formar uma cadeia circular, onde cada processo espera para um recurso que o processo seguinte na cadeia detém
Evite pelo menos um destes, e de preferência mais, e você não deve ter muitos problemas.
Não é assim chamado do banqueiro algoritmo , para evitar impasse. Além disso, você pode considerar o uso de Watch Dog a fim de quebrar o formulário impasse. Aqui também alguns pontos interessantes.
A técnica canônico para evitar impasse é ter uma hierarquia de bloqueio. Certifique-se de que todos os tópicos adquirir bloqueios ou outros recursos na mesma ordem. Isso evita o cenário de impasse onde bloqueio de segmento A e necessidades 1 manter o bloqueio B, enquanto rosca 2 mantém bloqueio B e necessidades bloquear A. Com uma hierarquia de bloqueio, ambas as linhas teriam de adquirir os bloqueios na mesma ordem (por exemplo, A antes de B) .
A melhor prática seria através da definição de uma classe para a sua discussão e utilizar apenas campos não-estático dessa classe na sua linha para que seus tópicos não vai estar compartilhando qualquer memória.
Claro que, para impasses evitá-lo também pode evitar o uso de semáforos, seções críticas e semáforos. Menos é melhor, se você quiser evitar impasses. Infelizmente, estes são necessários se alguma memória ou outro recurso é compartilhado entre dois segmentos ou então corre o risco de corrupção de dados.
Entre os vários métodos para entrar seções críticas -. Semáforos e mutexs são os mais populares
-
Um semáforo é um mecanismo de espera e exclusão mútua é um mecanismo de bloqueio, bem o conceito é confuso para a maioria, mas em suma, um fio de ativação de um mutex só pode desativá-lo. com isso em mente ...
-
Não permitir que qualquer processo para bloquear qualquer parcial de recursos, se uma necessidade processo 5 recursos, espere até que toda a estão disponíveis.
- se u usar semáforo aqui, u pode desbloquear / un-esperar o recurso ocupado por outro segmento. Com isto quero dizer a preempção é outra razão.
Estes 2 de acordo com a mim são as condições básicas, os restantes 2 dos comuns 4 precauções podem ser relacionados a estes.
Se u não concordar comentários Adicionar ps. Eu GTG já tarde, eu mais tarde irá adicionar um produto de limpeza e explicação mais clara.