Pergunta

Se as fechaduras certificar-se de apenas um segmento acessa os dados trancados em um momento, então o que controla o acesso às funções de bloqueio?

Eu pensei que boost :: mutex :: scoped_lock deve ser no início de cada uma das minhas funções para as variáveis ??locais não se modificou de forma inesperada por outro segmento, que é correto? E se dois tópicos estão tentando adquirir o bloqueio às vezes muito próximos? Não variáveis ??locais da fechadura internamente usado ser corrompido pelo outro segmento?

A minha pergunta não é específico aumentar, mas eu provavelmente vou estar usando a menos que você recomendar um outro.

Foi útil?

Solução

Você tem razão, ao implementar bloqueios que você precisa de alguma forma de garantir que dois processos não recebem o bloqueio ao mesmo tempo. Para fazer isso, você precisa usar uma instrução atômica - que tem garantido para completa sem interrupção. Uma tal instrução é test-and-set , uma operação que vai ter a estado de uma variável booleana, defini-lo como verdadeiro, e retornar ao estado obtidas anteriormente.

O que isto faz é o que lhe permite escrever código que testa continuamente para ver se ele pode obter o bloqueio. Suponha que x é uma variável compartilhada entre segmentos:

while(testandset(x));
// ...
// critical section
// this code can only be executed by once thread at a time
// ...
x = 0; // set x to 0, allow another process into critical section

Uma vez que os outros tópicos testar continuamente o bloqueio até que eles são deixe na seção crítica, esta é uma forma muito ineficiente de garantir a exclusão mútua. No entanto, usando este conceito simples, você pode construir estruturas de controle mais complicadas, como semáforos que são muito mais eficientes (porque os processos não são looping, eles estão dormindo)

Outras dicas

Você só precisa ter acesso exclusivo a dados compartilhados. A menos que eles são estáticos ou na pilha, variáveis ??locais dentro de funções terá diferentes instâncias para diferentes tópicos e não há necessidade de preocupação. Mas os dados compartilhados (material acessado via ponteiros, por exemplo) deve ser bloqueado em primeiro lugar.

Quanto à forma como fechaduras trabalho, eles são cuidadosamente projetados para evitar condições de corrida e muitas vezes têm suporte no nível de hardware para atomicity garantia. IE, existem algumas construções de linguagem de máquina garantidos para ser atômica. Semáforos (e semáforos) pode ser implementado via estes.

A explicação mais simples é que as fechaduras, caminho por baixo, são baseadas em uma instrução de hardware que está garantido para ser atômica e não podem colidir entre segmentos.

variáveis ??locais comuns em uma função já são específicos para um segmento individual. É apenas estática, globals, ou outros dados que podem ser acessados ??simultaneamente por vários segmentos que precisa ter fechaduras protegendo-o.

O mecanismo que opera o acesso controles de bloqueio a ele.

Qualquer bloqueio necessidades primitivas para ser capaz de comunicar mudanças entre processadores, por isso é normalmente implementado em cima de operações de ônibus, ou seja, leitura e escrita na memória. Ele também precisa ser estruturado de tal forma que dois tópicos que tentam alegar que não irá corromper seu estado. Não é fácil, mas geralmente você pode confiar que qualquer bloqueio OS implementado não vai ficar corrompido por vários segmentos.

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