O que significa a instrução" lock " na montagem x86?

Vi uma montagem x86 Na Fonte do Qt.
q_atomic_increment:
    movl 4(%esp), %ecx
    lock 
    incl (%ecx)
    mov $0,%eax
    setne %al
    ret

    .align 4,0x90
    .type q_atomic_increment,@function
    .size   q_atomic_increment,.-q_atomic_increment
  1. de pesquisar no Google, eu sabia que as instruções iam fazer com que a CPU fechasse o autocarro, mas não sei quando é que a CPU liberta o autocarro?

  2. sobre todo o código acima, eu não entendo como este código implementa o Add?

Author: unwind, 2012-01-17

3 answers

  1. LOCK is not an instruction itself: it is an instruction prefix, which applies to the following instruction. Essa instrução deve ser algo que faz uma leitura-modificar-escrever na memória (INC, XCHG, CMPXCHG etc.)- - - neste caso é a instrução incl (%ecx) que increimenta a palavra long no endereço mantido no registo ecx.

    O prefixo LOCK garante que a CPU tem a propriedade exclusiva da linha de cache apropriada durante o período de validade do e fornece certas garantias adicionais de encomenda. Isso pode ser conseguido através da afirmação de um bloqueio de ônibus, mas a CPU evitará isso sempre que possível. Se o autocarro estiver bloqueado, será apenas durante a instrução de bloqueio.

  2. Este código copia o endereço da variável a ser incrementada da pilha para o registo ecx, depois faz lock incl (%ecx) para aumentar atomicamente essa variável em 1. As duas instruções seguintes definem o registo eax (que contém o return value from the function) to 0 if the new value of the variable is 0, and 1 otherwise. A operação é um incremento , não um acréscimo (daí o nome).

 70
Author: Anthony Williams, 2012-01-17 08:46:09

O que você pode não entender é que o microcódigo necessário para aumentar um valor requer que nós Lamos primeiro no valor antigo.

A palavra-chave de bloqueio força as múltiplas instruções micro que estão realmente a ocorrer a funcionar atomicamente.

Se você tivesse 2 threads tentam, cada um, para incrementar a mesma variável, e ambos leram o mesmo valor original, ao mesmo tempo, em seguida, ambos de incremento para o mesmo valor, e ambos escrever o mesmo valor.

Em vez de ter a variável incrementada duas vezes, que é a expectativa típica, você acaba aumentando a variável uma vez.

A palavra-chave bloqueia isto.

 11
Author: Dan, 2013-03-23 23:36:54
Do google, eu sabia que as instruções de bloqueio fariam com que a cpu fechasse o autocarro,mas eu ... não sabes quando a cpu liberta o autocarro ?

LOCK é um prefixo de instrução, portanto só se aplica à seguinte instrução, a fonte não deixa muito claro aqui, mas a instrução real é LOCK INC. Então o autocarro está trancado para o incremento, e depois desbloqueado.

Quanto ao código acima, não entendo como é que este código implementou o Add?
Eles não ... implementar um Add, eles implementam um incremento, juntamente com uma indicação de retorno se o valor antigo era 0. Uma adição usaria LOCK XADD (no entanto, windows InterlockedIncrement / Decrement também são implementados com LOCK XADD).
 10
Author: Necrolis, 2012-01-17 07:47:06