Pergunta

Eu estou querendo saber, e na necessidade, de estratégias que podem ser aplicadas para reduzir bloqueio de baixo nível. No entanto, o problema aqui é que este não é novo código (com dezenas de milhares de linhas de código C ++) para um aplicativo de servidor, então eu não pode simplesmente reescrever a coisa toda.

Eu temo que pode não ser uma solução para este problema até agora (tarde demais). No entanto, eu gostaria de ouvir sobre bons padrões de outros já utilizados.

Neste momento, existem muitos bloqueio e não como muitos conflitos, por isso é um problema de desempenho hardware paranóia induzida. A melhor maneira de descrever o código é o código da thread único repente ficar salpicada com fechaduras.

Foi útil?

Solução

Por que você precisa para eliminar o bloqueio de baixo nível? Você tem problemas de impasse? Você tem problemas de desempenho? Ou escalar questões? São as fechaduras em geral sustentou ou uncontended?

Que ambiente você está usando? As respostas em C ++ será diferente para os de Java, por exemplo. Por exemplo. blocos de sincronização uncontended em Java 6 são realmente relativamente barato em termos de desempenho, tão simplesmente atualizar o JRE pode começar após qualquer problema que você está tentando resolver. Pode haver aumento de desempenho semelhantes disponíveis no C ++, mudando para um compilador ou diferente biblioteca de bloqueio.

Em geral, existem várias estratégias que permitem reduzir o número de semáforos que você adquire.

Em primeiro lugar, qualquer coisa só já acedido a partir de um único segmento não precisa de um mutex.

Em segundo lugar, qualquer coisa imutável é segura, desde que seja 'publicado em segurança' (ou seja criado de tal forma que um objeto parcialmente construído não é visível para outro segmento).

Em terceiro lugar, a maioria das plataformas agora suportam gravações atômicas - o que pode ajudar quando um único tipo primitivo (incluindo um ponteiro) é tudo o que precisa de proteção. Estes funcionam de forma muito semelhante ao bloqueio otimista em um banco de dados. Você também pode usar as gravações atômicas para criar algoritmos sem bloqueio para substituir tipos mais complexos, incluindo Mapa implementações. No entanto, a menos que você é muito, muito bom, você é muito melhor fora pedindo alguém implementação pessoa está depurado (o pacote java.util.concurrent contém muitos bons exemplos) - é notoriamente fácil de acidentalmente introduzir erros ao escrever seus próprios algoritmos <. / p>

Em quarto lugar, o alargamento do âmbito da exclusão mútua pode ajudar - ou simplesmente segurando aberto um mutex por mais tempo, em vez de constantemente bloquear e desbloquear-lo, ou tomar um bloqueio no item 'maior' - o objeto, em vez de uma de suas propriedades , por exemplo. No entanto, isso tem que ser feito com muito cuidado; você pode facilmente introduzir problemas desta forma.

Outras dicas

O modelo de segmentação de seu programa tem que ser decidido antes de uma única linha está escrito. Qualquer módulo, se inconsistente com o resto do programa, pode falhar, corrupto de impasse a aplicação.

Se você tem o luxo de começar fresco, tente identificar grandes funções do seu programa que pode ser feito em paralelo e usar um pool de threads para agendar as tarefas. O truque para a eficiência é mutexes Evitar sempre que possível e (re) código de seu aplicativo para contenção evitar de recursos a um nível elevado.

Você pode encontrar algumas das respostas aqui aqui útil como você procurar maneiras de estado atomicamente atualização compartilhada sem bloqueios explícitos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top