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?

Foi útil?

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).

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