São operações int C ++ atômica na arquitetura MIPS
-
22-08-2019 - |
Pergunta
Gostaria de saber se eu poderia ler ou escrever compartilhada valor int sem travar em MIPS CPU (especialmente Amazon ou Danúbio). O que quero dizer é se tal ler ou escrever são atômicas (outro segmento não pode interromper-los). Para ser claro -. Eu não quero para evitar a corrida entre threads, mas eu me importo se o próprio valor int não está corrompido
Assumindo que o compilador alinha todos os ints nos limites da palavra cpu, deve ser possível. Eu uso GCC (g ++). Testes também mostra que parece trabalho corretamente. Mas talvez alguém sabe com certeza?
Solução
Use gcc é builtin operações atômicas e você receberá avisos se eles não estão suportados: http://gcc.gnu.org/onlinedocs/ gcc-4.1.2 / gcc / Atomic-Builtins.html
Parece que combinações de adição / subtração e testes (pelo menos) são possíveis no hardware: http://rswiki.csie.org/lxr/ http / fonte / include / asm-mips / atomic.h
Outras dicas
Depende da operação. Tendo olhou para programas desmontados suficientes em MIPS, eu sei que apenas algumas operações são atômicas.
atribuição de um novo valor pode ser 1 op ou mais, você tem que olhar para a montagem.
por exemplo:
x = 0; // move $a0, $0
x = 0x50000; // lui $a0, 0x0005
x = 0x50234; // lui $a0, 0x0005
// ori $a0, 0x0234
MIPS assembley referência ou aqui
aqui para veja Danúbio e Amazon são MIPS32, que meu exemplo cobre, e, portanto, não todos de 32 bits inteiro imediato pode ser escrito atomicamente.
R10000 em cima postagem é MIPS64. Desde um valor de 32 bits seria metade do tamanho registo, poderia ser uma carga atômica / gravação.
Quais operações? É plausível que int a; a=42;
é atômica. Não há nenhuma garantia de que a= a+42;
é atômica, ou em qualquer variantes como com ++
. Além disso, você tem que estar preocupado com o que o otimizador pode fazer, dizer, mantendo um valor intermediário num registo quando conveniente.
A questão convida enganosas respostas.
Você só pode autoritariamente responder "É atômicas" dúvidas sobre a montagem / linguagem de máquina.
Qualquer dado fragmento de código C / C ++ não faz nenhuma garantia, pode variar dependendo exatamente qual compilador (e versão) que você usa, etc. (A menos que você chamar alguns intrínseco específico da plataforma ou outros enfeites que é garantido para compilar a um conhecido atômica instrução de máquina).